我在下面写了这段代码:
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
会引起问题。运行程序后出现以下错误:
*** 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
尝试在指针上分配内存时会产生分段错误(printf
给出正确的输出,因此正确计算了前缀和,并且输出按应有的方式保存在 addrArray 中)。为了构建这个程序,我为 g++ 和 nvcc 设置了如下标志:
GXXFLAGS:= -O3 -Wall -Wextra -m64 -std=c++0x
NVCCFLAGS:= -Xcompiler -Wall -Xcompiler -Wextra -m64 -arch=sm_11
(我有 GeForce310M 所以我必须设置 sm_11)所以我的问题是为什么运行这个推力函数会产生错误,为什么我不能释放在主机上分配的内存使用free()
?