cuda、pycuda -- 如何编写复数 -- 错误:类“cuComplex”没有成员“i”
我在 cuda、pycuda 中使用复数有困难。
我在 C 中有这个:
#include <complex>
typedef std::complex<double> cmplx;
....
cmplx j(0.,1.);
另外,在相同的代码中:
#include <boost/python.hpp>
#include <boost/array.hpp>
...
typedef std::vector< boost::array<std::complex<double>,3 > > ComplexFieldType;
typedef std::vector< boost::array<double,3> > RealFieldType;
...
__global__ void compute(RealFieldType const & Rs,ComplexFieldType const & M,..)
...
我如何将其转换为与 pycuda 一起使用? 我尝试了这样的操作(根据“cuda by an example”一书):
struct cuComplex {
float real;
float imag;
cuComplex(float a,float b): real(a),imag(b){}
cuComplex operator *(const cuComplex& a) {
return cuComplex(real*a.real -imag*a.imag ,imag*a.real +real*a.imag);
}
cuComplex operator +(const cuComplex& a) {
return cuComplex(real+a.real ,imag+a.imag);
};
cuComplex j(0.,1.); //instead of cmplx j(0.,1.);
__global__ void compute(float *Rs,cuComplex * M,..) //instead of RealFieldType const & Rs,ComplexFieldType const & M
....
我犯的一些错误是:
不允许数据成员初始值设定项
此声明没有存储类或类型说明符
谢谢!
---------------------编辑--------------------- -------------------------
我使用 #include
执行了以下操作(相对于上面) :
pycuda::complex<float> cmplx;
cmplx j(0.,1.);
以及 typedef std::vector boost::array
和 ComplexFieldType const & M
,在全局函数内,
我尝试了“float *M”或“cmplx *M”。
到目前为止,我收到错误:
变量“cmplx”不是类型名称
如果我使用 pycuda::complex cmplx; ,然后我得到:
标识符“cmplx”未定义
名称后跟“::”必须是类或命名空间名称
另外:
<块引用>表达式必须具有指向对象的指针类型(但也许这是来自代码的另一部分)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
确实不清楚您实际上想要做什么(如果您确实了解自己),并且随着编辑和评论的不断进行,问题变得越来越混乱。但为了稍微扩展 Andreas 的答案,这里有一段简单的、可编译的 CUDA 代码,它正确使用 pycuda 本机复杂类型:
这为您提供了普通内核的单双实数和复杂版本,并使用 nvcc 进行编译,如下所示:
也许这在某种程度上回答了你的问题......
It really isn't clear what you are actually trying to do (if you actually know yourself), and the question is getting progressively more confused as the edits and comments roll on. But to expand Andreas's answer a little, here is a simple, compilable piece of CUDA code which uses the pycuda native complex type correctly:
This gives you single and double real and complex versions of the trivial kernel and compiles with nvcc something like this:
Perhaps this goes someway to answering your question....
使用
与
std::complex<>
相同的接口,实际上源自其 STLport 版本。Use
Same interface as
std::complex<>
, in fact derived from the STLport version of that.