cudaMemset在__device__变量上失败

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)

tal*_*ies 5

您的问题是d_test(因为它出现在主机符号表中)不是有效的设备地址,运行时无法直接访问它.解决方案是使用cudaGetSymbolAddressAPI函数在运行时从上下文中读取设备符号的地址.这是一个应该正常工作的演示案例的略微扩展版本:

#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)