我有:
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 ..
答案 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只能处理当前的空指针。