1 cuda
我在使用cudaMemset
设备变量时遇到问题.是否可以使用对设备变量的引用cudaMemset
,或者只是缺少编译器标志或库..我正在使用cuda 4.1,并且
NVRM版本:NVIDIA UNIX x86_64内核模块285.05.33 Thu Jan 19 14:07:02 PST 2012
这是我的示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <cuda_runtime.h>
// device variable and kernel
__device__ float d_test;
int main() {
if (cudaMemset(&d_test,0,sizeof(float)) !=cudaSuccess)
printf("Error!\n");
}
Run Code Online (Sandbox Code Playgroud)
哪个输出:
Error!
Run Code Online (Sandbox Code Playgroud)
您的问题是d_test
(因为它出现在主机符号表中)不是有效的设备地址,运行时无法直接访问它.解决方案是使用cudaGetSymbolAddress
API函数在运行时从上下文中读取设备符号的地址.这是一个应该正常工作的演示案例的略微扩展版本:
#include <stdio.h>
#include <stdlib.h>
#include <cuda_runtime.h>
// device variable and kernel
__device__ float d_test;
inline void gpuAssert(cudaError_t code, char * file, int line, bool Abort=true)
{
if (code != cudaSuccess) {
fprintf(stderr, "GPUassert: %s %s %d\n", cudaGetErrorString(code),file,line);
if (Abort) exit(code);
}
}
#define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); }
int main()
{
float * _d_test;
gpuErrchk( cudaFree(0) );
gpuErrchk( cudaGetSymbolAddress((void **)&_d_test, "d_test") );
gpuErrchk( cudaMemset(_d_test,0,sizeof(float)) );
gpuErrchk( cudaThreadExit() );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这里,我们d_test
从上下文中读取设备符号的地址到主机指针_d_test
.这可以被传递到主机像侧的API函数cudaMemset
,cudaMemcpy
等等.
编辑注意,cudaGetSymbolAddress
此答案中显示的表单已被弃用并从CUDA运行时API中删除.对于现代CUDA,呼叫将是:
gpuErrchk( cudaGetSymbolAddress((void **)&_d_test, d_test) );
Run Code Online (Sandbox Code Playgroud)