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* 유형이고 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()?

+0

binaryDataSet의 유형은 무엇입니까? –

+0

질문 상태 : binaryDataSet은'unsigned int *'유형이다. –

답변

3

이 올바르지 않습니다 :

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

대신이 시도 : 여기

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

의도는, 산술 바이트하지 포인터 연산을하는 것입니다. 그리고 두 번째 코드 샘플에서도 마찬가지입니다.

-std=c++0x 

그러나 나는 그것이 문제 중 어느 하나의 소스입니다 있는지 알고하지 않습니다

나는 또한 지정하는 것이 좋습니다 모르겠어요.

일반 호스트 포인터에 cudaFree을 사용하면 안됩니다.