2013-08-12 3 views
0

Я написал этот код ниже: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()?

+0

какой тип binaryDataSet? –

+0

В вопросе говорится: binaryDataSet - это 'unsigned int *' type –

ответ

3

Это не правильно:

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

Попробуйте вместо этого:

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

Намерения здесь делать арифметические операции над указателями, а не байты арифметики. И аналогично в вашем втором примере кода.

Я также не уверен, что это хорошая идея, чтобы указать:

-std=c++0x 

Но я не знаю, что это источник любого из ваших проблем.

Вы определенно не должны делать cudaFree на обычном указателе хозяина.

Смежные вопросы