cudaMemset在_设备_变量上失败

cudaMemset在_设备_变量上失败,cuda,Cuda,在设备变量上使用cudaMemset时遇到问题。是否可以为cudaMemset使用对设备变量的引用,或者只是缺少编译器标志或库的问题。。我正在使用cuda 4.1,并且 NVRM版本:NVIDIA UNIX x86_64内核模块285.05.33 1月19日星期四 2012年太平洋标准时间14:07:02 这是我的示例代码: #include <stdio.h> #include <stdlib.h> #include <cuda_runtime.h> //

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

NVRM版本:NVIDIA UNIX x86_64内核模块285.05.33 1月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");
}

您的问题是
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
(如主机符号表中所示)不是有效的设备地址,运行时无法直接访问它。解决方案是使用
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;
}

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

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

cudaMemcpyFromSymbol(&h_test,"d_test",sizeof(float),0,cudaMemcpyDeviceToHost);
当然,还有CUDAMEMCPITOSYMBOL来更改全局变量的值


这个想法来自这里:

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

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

cudaMemcpyFromSymbol(&h_test,"d_test",sizeof(float),0,cudaMemcpyDeviceToHost);
当然,还有CUDAMEMCPITOSYMBOL来更改全局变量的值


这个想法来自这里:

谢谢!这很有效。。很高兴了解从上下文中提取符号地址的“cudaGetSymbolAddress”函数。谢谢!这很有效。。很高兴了解从上下文中提取符号地址的“cudaGetSymbolAddress”函数。cudaGetSymbolAddress对我不起作用。我需要添加一些编译器标志吗?我复制了上面的代码,但上面写着GPUassert:invalid device symbol XXXX.cu 24cudaGetSymbolAddress对我不起作用。我需要添加一些编译器标志吗?我复制了上面的代码,但上面写着GPUassert:invalid device symbol XXXX.cu 24请注意,此答案中显示的
cudaMemcpyFromSymbol
调用形式长期不受欢迎,在CUDA 5或CUDA 6中都不受支持。请注意,此答案中显示的
cudaMemcpyFromSymbol
调用形式长期不受欢迎,在CUDA 5或CUDA 6中不受支持CUDA 5或CUDA 6
cudaMemcpyFromSymbol(&h_test,"d_test",sizeof(float),0,cudaMemcpyDeviceToHost);