如何将结构传递到CUDA设备?

如何将结构传递到CUDA设备?,cuda,structure,Cuda,Structure,我已经在这上面呆了一段时间了。当我通过内核参数将我的结构传递到CUDA时,它们不包含任何数据,并且其中的所有内容都是未定义的 在主机全局空间中 struct matl1 { static const double cond; }; const double matl1::cond = 420.5; 然后在main()的内部 我得到以下错误: error : identifier "matl1::cond" is undefined in device code 作为快速测试,如果我

我已经在这上面呆了一段时间了。当我通过内核参数将我的结构传递到CUDA时,它们不包含任何数据,并且其中的所有内容都是未定义的

在主机全局空间中

struct matl1
{
    static const double cond;
};

const double matl1::cond = 420.5;
然后在main()的内部

我得到以下错误:

error : identifier "matl1::cond" is undefined in device code
作为快速测试,如果我在main()中的主机上执行以下操作

cout cond“C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\bin\nvcc.exe”-gencode=arch=compute\u 35,code=\“sm\u 35,compute\u 35\”--使用本地环境--cl版本2012-ccbin“C:\Program Files(x86)\Microsoft Visual Studio 11.0\VC\bin”-I“C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\include”-I“C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\include“-G--keep dir Debug-maxregcount=0--machine 32--compile--cudart static-G-DWIN32-D_Debug-D_CONSOLE-D_MBCS-Xcompiler”/EHsc/W3/nologo/Od/Zi/RTC1/MDd“-Debug\kernel.cu.obj”C:\Users\User\Documents\Visual\visualstudio 2012\Projects\test\u struct\test\test\struct\test
1> C:/Users/User/Documents/visualstudio 2012/Projects/test_struct/test_struct/kernel.cu(15):错误:设备代码中未定义标识符“matl1::cond”

C:\Program Files(x86)\MSBuild\Microsoft.Cpp\v4.0\V110\BuildCustomizations\CUDA 5.5.targets(592,9):错误MSB3721:命令“C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\bin\nvcc.exe”-gencode=arch=compute\u 35,代码=\“sm\u 35,compute\u 35\”--使用本地环境--cl版本2012-ccbin“C:\Program Files(x86)\Microsoft Visual Studio 11.0\VC\bin“-I”C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\include“-I”C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\include“-G--keep dir Debug-maxrregcount=0--machine 32--compile-cudart static-G-DWIN32--D_Debug-D_控制台-D_MBCS-Xcompiler”/EHsc/W3/nologo/Od/Zi/RTC1/MDd”-o Debug\kernel.cu.obj“C:\Users\User\Documents\Visual Studio 2012\Projects\test\u struct\test\u struct\kernel.cu”已退出,代码为2


============生成:0成功,1失败,0最新,0跳过==============

如果执行此操作,我可以重现您的错误:

struct matl1
{
    static const double cond;
};



__global__ void kernel(matl1* d_matl1)
{
double cond = d_matl1->cond;
printf("cond = %lf\n", cond);
}

const double matl1::cond = 420.5;
struct matl1
{
    static const double cond;
};

const double matl1::cond = 420.5;

__global__ void kernel(matl1* d_matl1)
{
double cond = d_matl1->cond;
printf("cond = %lf\n", cond);
}
但如果我这样做的话:

struct matl1
{
    static const double cond;
};



__global__ void kernel(matl1* d_matl1)
{
double cond = d_matl1->cond;
printf("cond = %lf\n", cond);
}

const double matl1::cond = 420.5;
struct matl1
{
    static const double cond;
};

const double matl1::cond = 420.5;

__global__ void kernel(matl1* d_matl1)
{
double cond = d_matl1->cond;
printf("cond = %lf\n", cond);
}

您需要在内核定义之前定义常量初始值设定项。这是一个对我有效的完整示例。

它似乎对我有效。请参阅我在使用CUDA 5.5的linux上执行此操作。您需要提供更多细节和实际的完整示例,正如我所做的那样,以便我们可以查看编译器的所有代码和输出。确定平台(linux、windows等),CUDA的哪个版本,并提供完整的代码、编译命令的完整输出以及完整的编译命令。我不知道我到底出了什么问题。即使使用您的代码(与我的原始代码几乎相同),我也会收到相同的错误:“错误:标识符”matl1::cond“在设备代码中未定义”。我正在使用以下操作系统:Windows 7 Pro x64、GPU:GTX Titan、最新331个驱动程序、编译器:Visual Studio Pro 2012和Nvidia NSight、CUDA版本:5.5、Compute/SM arch:均设置为3.5。它可能是我的编译器吗?明天早上我还会发布其余的编译器输出。我不能再发布8个小时了,而且输出太长了,无法在这里进行评论,甚至无法分成几个部分。这是Windows工具链的一个特点。使用基于gcc的工具链将未修饰的常量编译成主机和设备代码,但不使用Microsoft编译器。我以前也有过类似的问题,在Linux和OS X上工作的东西在Win 32系统上失败了。在这种情况下,我认为它在gcc中工作是一个意外。我对数据模型的解释是,任何结构或类数据成员都只在中定义的宿主结构的内存空间中定义。在这种情况下,这应该只是主机内存空间。@Talonmes为什么不提供一个答案,我将删除我的。
struct matl1
{
    static const double cond;
};

const double matl1::cond = 420.5;

__global__ void kernel(matl1* d_matl1)
{
double cond = d_matl1->cond;
printf("cond = %lf\n", cond);
}