库达推力内存管理
Cuda Thrust memory management
我在下面写了这段代码:
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
。
相关文章:
- 当vector是tje全局变量时,c++中vector的内存管理
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- C++将字符串传递给 C 库以进行内存管理
- 从函数返回时C++内存管理
- 函数指针和 lambda 的内存管理
- 自定义内存管理器在发布模式下工作正常,但在调试模式下则不然
- C++中的内存管理
- C和C++中的内存管理有什么区别
- 字符 * 未从重载运算符或内存管理问题正确返回
- 如何在源代码中使用执行策略检测 C++17 的扩展内存管理算法的可用性?
- 底层指针和内存管理
- 智能指针,避免使用QNetworkAccessManager时进行手动内存管理
- c++中的内存管理问题
- 使用矢量时的内存管理
- 循环和内存管理中的指针算术C++?
- C++堆栈内存管理问题
- C 内存管理中的课程如何管理 - 研究
- 不可变数据模型的内存管理
- C++ 使用数组初始化时的 STL 向量内存管理
- SFML 纹理内存管理