C++ cuda,pycuda——如何写复数——错误:class“;“cuComplex”;“没有成员”;我";

C++ cuda,pycuda——如何写复数——错误:class“;“cuComplex”;“没有成员”;我";,c++,cuda,complex-numbers,pycuda,C++,Cuda,Complex Numbers,Pycuda,我很难在cuda,pycuda中使用复数 我有一个C: #include <complex> typedef std::complex<double> cmplx; .... cmplx j(0.,1.); 我犯的一些错误是: 不允许使用数据成员初始值设定项 此声明没有存储类或类型说明符 谢谢大家! ---------------------编辑---------------------------------------------- 我使用#include(相

我很难在cuda,pycuda中使用复数

我有一个C:

#include <complex>
typedef std::complex<double> cmplx;
....
cmplx j(0.,1.);   
我犯的一些错误是:

不允许使用数据成员初始值设定项

此声明没有存储类或类型说明符

谢谢大家!

---------------------编辑----------------------------------------------

我使用
#include
(相对于上述内容)完成了以下操作:

pycuda::复杂cmplx;
cmplxj(0,1.);
至于
typedef std::vectorComplexFieldType

ComplexFieldType const&M
,在全局函数中, 我试过“float*M”或“cmplx*M”

到目前为止,我一直在犯错误:

变量“cmplx”不是类型名称

如果我使用pycuda::complex cmplx,然后我得到:

标识符“cmplx”未定义

名称后跟“::”必须是类或命名空间名称

此外:

表达式必须有指向对象类型的指针(但这可能来自代码的另一部分)

使用

#包括
{
pycuda::配合物x(5,17);
}
与std::complex相同的接口,实际上是从STLport版本派生的。

使用

#包括
{
pycuda::配合物x(5,17);
}

与std::complex
相同的界面,实际上是从STLport版本派生出来的。

确实不清楚您实际上在尝试做什么(如果您确实了解自己),随着编辑和注释的进行,问题越来越复杂。但为了稍微扩展Andreas的答案,这里有一段简单、可编译的CUDA代码,它正确地使用了pycuda本机复杂类型:

#include <pycuda-complex.hpp>

template<typename T>
__global__ void kernel(const T * x, const T *y, T *z)
{
    int tid = threadIdx.x + blockDim.x * blockIdx.x;

    z[tid] = x[tid] + y[tid];
}


typedef pycuda::complex<float> scmplx;
typedef pycuda::complex<double> dcmplx;

template void kernel<float>(const float *, const float *, float *);
template void kernel<double>(const double *, const double *, double *);
template void kernel<scmplx>(const scmplx *, const scmplx *, scmplx *);
template void kernel<dcmplx>(const dcmplx *, const dcmplx *, dcmplx *);

也许这可以在某种程度上回答你的问题……

真的不清楚你到底想做什么(如果你真的了解自己的话),而且随着编辑和评论的进行,这个问题变得越来越混乱。但为了稍微扩展Andreas的答案,这里有一段简单、可编译的CUDA代码,它正确地使用了pycuda本机复杂类型:

#include <pycuda-complex.hpp>

template<typename T>
__global__ void kernel(const T * x, const T *y, T *z)
{
    int tid = threadIdx.x + blockDim.x * blockIdx.x;

    z[tid] = x[tid] + y[tid];
}


typedef pycuda::complex<float> scmplx;
typedef pycuda::complex<double> dcmplx;

template void kernel<float>(const float *, const float *, float *);
template void kernel<double>(const double *, const double *, double *);
template void kernel<scmplx>(const scmplx *, const scmplx *, scmplx *);
template void kernel<dcmplx>(const dcmplx *, const dcmplx *, dcmplx *);

也许这有助于回答您的问题……

根据结构定义,它有
real
imag
字段,而不是
i
r
。还要注意的是,它们是
float
,而不是像C代码那样的
double
。好的,谢谢!我现在更新了!我不认为(也许我错了)在cuda代码中将它们作为float是错误的。(我也尝试了两次,但仍然有相同的错误)。@George:error“variable”cmplx“不是类型名”应该告诉你解决问题所需的一切。如果没有,你需要修改一些基本的C++——这是一个非常基本的和自我解释的错误。“我尝试”TyPulfPycUDA::复杂CMPLX;“但是它给了我“没有操作符”*匹配这些操作数类型:CMPLX*double。如果我尝试“TyPulf类型PycUdA::复合CMPLX;”它给我“类型名称是不允许的”。.我在c中没有这样的经验,所以我不知道如何处理这个问题。根据结构定义,它有
real
imag
字段,而不是
I
r
。还要注意的是,它们是
float
,而不是像C代码那样的
double
。好的,谢谢!我现在更新了!我不认为(也许我错了)在cuda代码中将它们作为float是错误的。(我也尝试了两次,但仍然有相同的错误)。@George:error“variable”cmplx“不是类型名”应该告诉你解决问题所需的一切。如果没有,你需要修改一些基本的C++——这是一个非常基本的和自我解释的错误。“我尝试”TyPulfPycUDA::复杂CMPLX;“但是它给了我“没有操作符”*匹配这些操作数类型:CMPLX*double。如果我尝试“TyPulf类型PycUdA::复合CMPLX;”它给我“类型名称是不允许的”。.我在c方面没有这样的经验,所以我不知道如何处理这个问题。:你好,Andreas,你能再次查看我的帖子吗?我照你说的做了,但仍然有问题。我更新了。谢谢!:你好,Andreas,你能再次查看我的帖子吗?我照你说的做了,但仍然有问题。我更新了。谢谢!我使用的是typedef pycuda::complex cmplx;但它给了我“无运算符”*“匹配这些操作数操作数类型是:cmplx*double”,因为我有一些计算为“Cn2=Cn1*3.0-2.0;”,其中Cn2和Cn1是cmplx。谢谢(我投赞成票)错误消息告诉您正在混合单精度和双精度类型
3.0
是一个双精度常数
3.0f
是一个单精度常数。说真的,在继续学习之前,你最好花点时间学习一些基本的C++,因为很明显,你不会得到太多的帮助。这就是问题所在。第二,我以前从来没有遇到过这样的问题,正如我所说的,我在C++方面没有太多的经验。当然,我需要大量的锻炼。但是你看,项目正在运行!:)。无论如何,我也得到了错误“表达式必须有指向对象类型的指针”,你有什么想法吗?谢谢!好的,这与指针和数组有关。我想我有一个数组作为float。改为float*就可以了。现在,我必须搜索另一个错误在哪里。谢谢你的帮助!我使用的是typedef pycuda::complex cmplx;但它给了我“无运算符”*“匹配这些操作数操作数类型是:cmplx*double”,因为我有一些计算为“Cn2=Cn1*3.0-2.0;”,其中Cn2和Cn1是cmplx。谢谢(我投赞成票)错误消息告诉您正在混合单精度和双精度类型
3.0
是一个双精度常数
3.0f
是一个单精度常数。说真的,在继续学习之前,你最好花点时间学习一些基本的C++,因为你不是G,这是非常明显的。
pycuda::complex<float> cmplx;

cmplx j(0.,1.);
#include <pycuda-complex.hpp>

{
  pycuda::complex<float> x(5, 17);
}
#include <pycuda-complex.hpp>

template<typename T>
__global__ void kernel(const T * x, const T *y, T *z)
{
    int tid = threadIdx.x + blockDim.x * blockIdx.x;

    z[tid] = x[tid] + y[tid];
}


typedef pycuda::complex<float> scmplx;
typedef pycuda::complex<double> dcmplx;

template void kernel<float>(const float *, const float *, float *);
template void kernel<double>(const double *, const double *, double *);
template void kernel<scmplx>(const scmplx *, const scmplx *, scmplx *);
template void kernel<dcmplx>(const dcmplx *, const dcmplx *, dcmplx *);
$ nvcc -arch=sm_20 -Xptxas="-v" -I$HOME/pycuda-2011.1.2/src/cuda -c scmplx.cu 
ptxas info    : Compiling entry function '_Z6kernelIN6pycuda7complexIdEEEvPKT_S5_PS3_' for 'sm_20'
ptxas info    : Used 12 registers, 44 bytes cmem[0], 168 bytes cmem[2], 4 bytes cmem[16]
ptxas info    : Compiling entry function '_Z6kernelIN6pycuda7complexIfEEEvPKT_S5_PS3_' for 'sm_20'
ptxas info    : Used 8 registers, 44 bytes cmem[0], 168 bytes cmem[2]
ptxas info    : Compiling entry function '_Z6kernelIdEvPKT_S2_PS0_' for 'sm_20'
ptxas info    : Used 8 registers, 44 bytes cmem[0], 168 bytes cmem[2]
ptxas info    : Compiling entry function '_Z6kernelIfEvPKT_S2_PS0_' for 'sm_20'
ptxas info    : Used 4 registers, 44 bytes cmem[0], 168 bytes cmem[2]