【问题标题】:cudaMemset fails on __device__ variablecudaMemset 在 __device__ 变量上失败
【发布时间】:2018-06-21 17:01:06
【问题描述】:

我在设备变量上使用cudaMemset 时遇到问题。是否可以使用对cudaMemset 的设备变量的引用,或者只是缺少编译器标志或库的问题。我使用的是 cuda 4.1,并且

NVRM 版本:NVIDIA UNIX x86_64 内核模块 285.05.33 Thu Jan 19 2012 年太平洋标准时间 14:07:02

这是我的示例代码:

#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");
}

哪个输出:

Error!

【问题讨论】:

  • cudaGetSymbolAddress 对我不起作用。我需要添加一些编译器标志吗?我复制上面的代码,但上面写着 GPUassert: invalid device symbol XXXX.cu 24

标签: cuda


【解决方案1】:

您的问题是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;
}

这里,我们将设备符号d_test的地址从上下文中读取到主机指针_d_test中。然后可以将其传递给主机端 API 函数,例如 cudaMemsetcudaMemcpy 等。


编辑请注意,此答案中显示的 cudaGetSymbolAddress 形式已被弃用并从 CUDA 运行时 API 中删除。对于现代 CUDA,调用将是:

gpuErrchk( cudaGetSymbolAddress((void **)&_d_test, d_test) );

【讨论】:

  • 谢谢!这行得通.. 很高兴了解从上下文中提取符号地址的“cudaGetSymbolAddress”函数。
【解决方案2】:

我相信你也可以使用 cudaMemcpyFromSymbol: 一个函数,比如下面的内核,可以改变全局内存中声明的变量的值(在主函数之外)

__global__ void kernel1() { d_test = 1.0; }

在您的 main 中,您可以使用 cudaMemcpyFromSymbol 获取值

cudaMemcpyFromSymbol(&h_test,"d_test",sizeof(float),0,cudaMemcpyDeviceToHost);

当然还有cudaMemcpyToSymbol来改变全局变量的值。

这个想法来自这里:Having problem assigning a device variable in CUDA

【讨论】:

  • 请注意,此答案中显示的cudaMemcpyFromSymbol 调用形式早已弃用,并且在 CUDA 5 或 CUDA 6 中均不受支持
猜你喜欢
  • 1970-01-01
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-07
  • 2011-11-16
  • 1970-01-01
相关资源
最近更新 更多