为了简化,假设我有这个结构:
someheader.h
typedef struct
{
float x
}someStruct;
在 Cuda 中,如果结构由 C++ 应用程序共享,设备函数将如何访问结构的成员?
例如:
__global__ void stuff( someStruct *g ) {
g[0].x = 0.4f;
}
这是正确的做法吗?它似乎不起作用。
最佳答案
您需要将结构数组传输到 GPU。
例如,要访问内核中的 float 组,您需要执行以下操作
__global__ static void myKernel(float *val)
{
val[0] = 0.4f;
}
int main()
{
...
cudaMemcpy(d_Val, h_Val, n * sizeof(float), cudaMemcpyHostToDevice);
...
}
这当然是基础知识。您可以将 float 替换为任何数据类型并获得相同的行为。结构不过是用户定义的数据类型。
这不同于发送单个 float (因此是单个结构),因为内核的所有输入都在运行时(取决于显卡)从 GPU 可以访问的位置推送到 GPU 内存系统的某个部分这些值。因此,如果输入是一个结构,当内核试图访问它时,整个结构都驻留在 GPU 上。但是如果你发送一个指向在主机上生成的结构的指针,GPU 具有指针的值而不是实际数据。
关于c++ - 访问 CUDA 中的结构成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5135689/