CUDA 5.5 cudaMemcpyToSymbol,__constant__和范围外错误
CUDA 5.5 cudaMemcpyToSymbol, __constant__ and out of scope error
我正在尝试编译一个CUDA示例,它具有;
cuda.cu:
__constant__ unsigned VERTICES;
__constant__ unsigned TRIANGLES;
以及main.cpp中的相应代码;
cudaMemcpyToSymbol(VERTICES, &verticesNo, sizeof(int));
cudaMemcpyToSymbol(TRIANGLES, &trianglesNo, sizeof(int));
如何避免编译main.cpp时出现"VERTICES not declared in this scope"错误?
TIA。
欢呼,
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
CUDA由nvcc编译器定义,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
- 在内核<lt;>>(…)格式
WRAPPER_HEADER.h包含一个C版本的:
- 包装器函数的声明(必须仅在C99中编写)
- 通用C形式的常量
- 每个线程或每个块的输入不同
- 计算结果的指针
- 每个块的线程数
- 块的数量
CUDA_HEADER.cuh包含:
- 包装器可以通过cudaMemcpyToSymbol(…)写入的
__constant__
内存的声明 - 使用
__global__
说明符的内核函数的声明
CUDA_KERNEL.cu包含:
- 内核
__global__
void内核(…)函数的实现 - 用
__device__
说明符声明的设备函数的声明和实现 __shared__
内存的声明(它只有一个块的生存期,所以不能根据我所能告诉的从包装器调用……任何人都可以随意更正)
CUDA文献中已经展示了其中的一些内容,我喜欢它,因为它确实将CUDA C作为一种专门的语言来区分。只有在处理设置和运行内核时,它才是必要的。
相关文章:
- "myClock"未在此范围错误中声明
- 包含来自另一个文件的函数会导致范围错误(openFoam)
- Visual C:命名空间范围错误或晦涩功能?
- 在遍历字符串时,为什么我没有超出范围错误,即使我已经超出了它的长度?
- 此范围错误中未声明如何修复
- 尝试声明函数的局部变量,但得到范围错误
- c ++ to_string未在此范围错误 [Windows + Devcpp 环境] 中声明
- 将文件读取到向量的向量,超出范围错误
- 向量下标出的范围错误.即使向量的索引大于访问数据的索引,也会发生误差
- Eratosthenes C 的筛子 - 内存处的范围错误
- 向量:内存处的范围错误
- 测试完美哈希函数时超出范围错误
- 为什么此代码会给出 Vector 超出范围错误
- 在填充 Arduino 草图时出现范围错误
- 如何修复C++中矢量的"下标超出范围"错误?
- CPP-模板范围错误
- 在此范围错误中未声明函数错误
- C 表达式:向量下标出范围错误线:1733
- 无法在好友函数中实例化类?我没有得到在范围错误中声明
- 带有类的嵌套结构.范围错误