我在下面写了这段代码:
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()
释放在主机上分配的内存?
答案 0 :(得分:3)
这是不正确的:
thrust::exclusive_scan(binaryDataSet,binaryDataSet+(sizeof(unsigned int)*DATASETROWS),addrArray);
请改为尝试:
thrust::exclusive_scan(binaryDataSet,binaryDataSet+(DATASETROWS),addrArray);
这里的意图是做指针算术,而不是字节算术。同样在你的第二个代码示例中。
我也不确定指定:
是个好主意-std=c++0x
但我不确定这是你的任何问题的根源。
你绝对不应该在普通主机指针上做cudaFree
。