CUDA:将cudaMemcpyHostToDevice与结构一起使用

时间:2011-02-27 06:15:50

标签: c cuda

我有:

typedef struct
{
    float x;
    float y;
    float z;
}vec3;

lineCuda.cu

extern "C" void cudaTranslate(vec3 *grid, float xrot,vec3 center, int multi)
{
    vec3 *dev_grid[2000];
    cudaMalloc( (void**)&dev_grid, sizeof(vec3)*2000 ) ;
    cudaMemcpy(dev_grid, grid, sizeof(vec3)*2000, cudaMemcpyHostToDevice); //error

编译正常但运​​行时显示:cube.exe中的0x75c6b727处的第一次机会异常:Microsoft C ++异常:内存位置为0x002cbef8的cudaError_enum ..

2 个答案:

答案 0 :(得分:3)

vec3 *dev_grid[2000];

应该是

vec3 dev_grid[2000];

好的,我明白了,做到了

vec3 *dev_grid = 0;

http://developer.download.nvidia.com/compute/cuda/2_3/toolkit/docs/online/group_CUDART_ERROR.html

  

const char * cudaGetErrorString(cudaError_t错误)       从错误代码返回消息字符串。   cudaError_t cudaGetLastError(void)       返回运行时调用的最后一个错误。

答案 1 :(得分:0)

CUDA使用主机指针(在CPU上)指向设备内存块(在GPU上)。

为此,它修改了cudaMalloc调用上的指针。之后,GPU上的内存将通过相应的cudaFree调用释放。

分配dev_grid时,使用CPU分配。指针的修改将使CPU不可能在以后使用空闲,删除或其他类似机制释放存储器。因此,CUDA最有可能内置一个检查来防止这种情况发生,使得cudaMalloc只能处理当前的空指针。