Cuda推力内存管理

时间:2013-08-12 22:35:30

标签: c++ c cuda gpu thrust

我在下面写了这段代码:

 unsigned int* addrArray = (unsigned int*)malloc(sizeof(unsigned int)*DATASETROWS);
 thrust::exclusive_scan(binaryDataSet,binaryDataSet+(sizeof(unsigned int)*DATASETROWS),addrArray);
 free(addrArray);

binaryDataSet是unsigned int*类型,我在分配,处理这部分内存中的数据并释放它时没有任何问题。但是addrArray会导致问题。 aftter运行程序我得到以下错误:

  

*** glibc detected *** ./prog: free(): invalid next size (normal): 0x000000000180be10 ***和记忆图。

当我使用cudaFree(addrArray)时,此代码不会生成此错误,但稍后会导致分段错误或glibc malloc内存损坏问题。例如运行:

unsigned int* addrArray = (unsigned int*)malloc(sizeof(unsigned int)*DATASETROWS);
thrust::exclusive_scan(binaryDataSet,binaryDataSet+(sizeof(unsigned int)*DATASETROWS),addrArray);
const unsigned int compactArraySize = addrArray[DATASETROWS-1] - 1;
printf("%u\n",compactArraySize)
float* compactMinorClass = (float*)malloc(sizeof(float)*DATASETCOLS*compactArraySize);

compactMinorClass指针上尝试使用malloc内存时会产生分段错误(printf给出正确的输出,因此正确计算prefixsum并且应该将输出保存在addrArray中)。 为了构建这个程序,我为g ++和nvcc设置了如下标志:

GXXFLAGS:= -O3 -Wall -Wextra -m64 -std=c++0x

NVCCFLAGS:= -Xcompiler -Wall -Xcompiler -Wextra -m64 -arch=sm_11

(我有GeForce310M所以我必须设置sm_11) 所以我的问题是为什么运行这个推力函数会产生错误,为什么我不能使用free()释放在主机上分配的内存?

1 个答案:

答案 0 :(得分:3)

这是不正确的:

thrust::exclusive_scan(binaryDataSet,binaryDataSet+(sizeof(unsigned int)*DATASETROWS),addrArray);

请改为尝试:

thrust::exclusive_scan(binaryDataSet,binaryDataSet+(DATASETROWS),addrArray);

这里的意图是做指针算术,而不是字节算术。同样在你的第二个代码示例中。

我也不确定指定:

是个好主意
-std=c++0x

但我不确定这是你的任何问题的根源。

你绝对不应该在普通主机指针上做cudaFree