我正在尝试编译一个具有;
的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。
欢呼声,
答案 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是包装函数:
WRAPPER_HEADER.h包含C版本:
CUDA_HEADER.cuh包含:
__constant__
内存
__global__
说明符CUDA_KERNEL.cu包含:
__global__
void kernel(...)function __device__
说明符__shared__
内存的声明(它只有一个块的生命周期,因此无法根据我能告诉的内容从包装器调用...随意纠正这个人)在CUDA文献中有一些证明,我喜欢它,因为它真正将CUDA C作为专业语言分离出来。只有在处理设置和运行内核时才需要它。