Я написал этот код ниже:Cuda Упорного управления памятью
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 ***
and memory map.
Этот код обыкновение генерировать эту ошибку, когда я использую cudaFree(addrArray)
вместо этого, но позже это вызовет ошибку сегментации или GLibC таНос проблемы коррупции памяти. Например работает следующим образом:
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
дает правильный вывод, так prefixsum рассчитывается корректно и выход сохраняется в addrArray, как и должно быть). Для создания этой программы я установить флаги для г ++ и NVCC следующим образом:
GXXFLAGS:= -O3 -Wall -Wextra -m64 -std=c++0x
NVCCFLAGS:= -Xcompiler -Wall -Xcompiler -Wextra -m64 -arch=sm_11
(у меня есть GeForce310M так что я должен установить sm_11) Так что мой вопрос, почему работает эта функция тяги генерирует ошибки, почему я не могу освободить выделенную память на хосте, используя free()
?
какой тип binaryDataSet? –
В вопросе говорится: binaryDataSet - это 'unsigned int *' type –