0

我在下面写了这段代码:

 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()

4

1 回答 1

3

这是不正确的:

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

试试这个:

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

这里的目的是进行指针运算,而不是字节运算。同样在您的第二个代码示例中。

我也不确定指定是否是个好主意:

-std=c++0x

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

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

于 2013-08-12T22:47:54.683 回答