CUDA 5.5 cudaMemcpyToSymbol,__ constant__并超出范围错误

时间:2013-12-12 05:24:14

标签: c++ cuda

我正在尝试编译一个具有;

的CUDA示例

cuda.cu:

__constant__ unsigned VERTICES;
__constant__ unsigned TRIANGLES;

和main.cpp中的相应代码;

cudaMemcpyToSymbol(VERTICES, &verticesNo, sizeof(int));
cudaMemcpyToSymbol(TRIANGLES, &trianglesNo, sizeof(int));

编译main.cpp时如何避免“在此范围内未声明的VERTICES”错误?

TIA。

欢呼声,

2 个答案:

答案 0 :(得分:3)

CUDA __constant__变量具有文件范围链接。这意味着cudaMemcpyToSymbol必须位于定义__constant__变量的同一.cu文件中。

您可以在.cu文件中添加包装函数,并从.cpp文件中调用此函数。

cuda.cu的样本:

__constant__ unsigned VERTICES;
__constant__ unsigned TRIANGLES;

void wrapper_fn(unsigned *verticesNo, unsigned *trianglesNo)
{
  cudaMemcpyToSymbol(VERTICES, verticesNo, sizeof(unsigned));
  cudaMemcpyToSymbol(TRIANGLES, trianglesNo, sizeof(unsigned));
}

然后只在main.cpp中调用wrapper_fn

答案 1 :(得分:-1)

CUDA由nvcc编译器定义,它本身是C99的扩展。听起来你真正想做的就是将CUDA分开,这样你就有了一个通用的头文件。然后,您可以使用C或C ++。我更喜欢亲自使用C ++中的数据,因此我发现最好的方法是使用以下文件并包含路径:

               WRAPPER_HEADER.h          CUDA_HEADER.cuh
                 /          \               /       \
                /            \             /         \
            #include      #include    #include     #include
              /                \         /             \
             /                  \       /               \
            /                    \     /                 \
  CALL.cpp/CALL.c            CUDA_WRAPPER.cu         CUDA_KERNEL.cu

CALL.c / CALL.cpp是包含你想要的任何调用包装函数的C / C ++

CUDA_WRAPPER.cu是包装函数:

  • 使用cudaMalloc / cudaMemcpy / cudaMemcpyToSymbol / cudaFree创建/释放设备内存,并从C或C ++调用的原始调用函数管理I / O.
  • 以内核<<>>(...)格式调用内核本身

WRAPPER_HEADER.h包含C版本:

  • 包装函数的声明(必须仅在C99中编写)
  • 通用C形式的常量
  • 每个线程或每个块的输入不同
  • 计算结果最终的指针
  • 每个块的线程数
  • 块数

CUDA_HEADER.cuh包含:

  • 声明包装器可以通过cudaMemcpyToSymbol(...)
  • 写入的__constant__内存
  • 使用__global__说明符
  • 的内核函数声明

CUDA_KERNEL.cu包含:

  • 内核__global__ void kernel(...)function
  • 的实现
  • 使用__device__说明符
  • 声明的设备函数的声明和实现
  • __shared__内存的声明(它只有一个块的生命周期,因此无法根据我能告诉的内容从包装器调用...随意纠正这个人)

在CUDA文献中有一些证明,我喜欢它,因为它真正将CUDA C作为专业语言分离出来。只有在处理设置和运行内核时才需要它。