库达推力内存管理

Cuda Thrust memory management

本文关键字:内存 管理      更新时间:2023-10-16

我在下面写了这段代码:

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

二进制数据集是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("%un",compactArraySize)
float* compactMinorClass = (float*)malloc(sizeof(float)*DATASETCOLS*compactArraySize);

尝试在指针上 malloc 内存时会产生分段错误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() 释放主机上分配的内存?

这是

不正确的:

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

试试这个:

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

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

我也不确定指定以下内容是个好主意:

-std=c++0x

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

您绝对不应该在普通的主机指针上执行cudaFree