는이 코드 아래 썼다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*
유형이고 I 메모리의이 부분에서, 처리 된 데이터를 할당하고 해제 아무런 문제가 없다. 그러나 addrArray
은 문제를 일으 킵니다. 프로그램을 실행 aftter 내가 오류 다음 얻을 :
*** glibc detected *** ./prog: free(): invalid next size (normal): 0x000000000180be10 ***
and memory map.
내가 대신 cudaFree(addrArray)
를 사용할 때이 코드는 습관이 오류가 발생하지만 나중에는 세그먼트 오류가 발생하거나 malloc에 메모리 손상 문제를 glibc가됩니다. 예를 들어이 실행 : compactMinorClass
포인터의 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);
이 세그먼트 오류를 생성합니다 (printf
정확한 출력을 제공하므로 prefixsum 올바르게 계산하고 출력해야한다으로 addrArray에 저장됩니다). 나는 다음과 같은 g ++ 및 NVCC에 대한 플래그를 설정하여이 프로그램을 빌드하려면
GXXFLAGS:= -O3 -Wall -Wextra -m64 -std=c++0x
NVCCFLAGS:= -Xcompiler -Wall -Xcompiler -Wextra -m64 -arch=sm_11
이 추력 기능을 실행하는 이유 그래서 제 질문은 (I 그래서 나는 sm_11을 설정해야 GeForce310M이) 오류가 발생하여 호스트에 할당 된 메모리를 해제 할 수없는 이유는 무엇입니까? free()
?
binaryDataSet의 유형은 무엇입니까? –
질문 상태 : binaryDataSet은'unsigned int *'유형이다. –