2014-10-28 4 views
0

추력 라이브러리를 사용하여 배열의 합계 (이미 CUDA 메모리에 있음)를 찾으려고합니다. 여기에 몇 가지 대답이 thrust :: device_ptr을 사용하여 줄 바꿈으로써 가능하지만 그것은 나를 위해 오류를 던지고있다.CUDA 메모리에서 추력을 호출 할 수 없습니다.

초기 코드

cudaMemcpy((void *)(data + stride), (void *)d_output, sizeof(unsigned int) * rows * cols, cudaMemcpyDeviceToHost); 
thrust::device_vector<unsigned int> vec((data + stride), (data + stride + (rows * cols))); 
sum = thrust::reduce(vec.begin(), vec.end()); 

위의 코드는 완벽하게 잘 작동합니다. 하지만 내가 변경하면

thrust::device_ptr<unsigned int> outputPtrBegin(d_output); 
thrust::device_ptr<unsigned int> outputPtrEnd((d_output + stride + (rows * cols))); 
sum = thrust::reduce(outputPtrBegin, outputPtrEnd); 

다음과 같은 오류가 발생합니다.

terminate called after throwing an instance of 'thrust::system::system_error' 
what(): an illegal memory access was encountered 
Aborted (core dumped) 

무엇이 문제 일 수 있습니까? 시간 내 주셔서 감사합니다.

* 편집 된 입력 Robert Crovella 실수는 보폭을 사용했습니다. 그들이 있기 때문에, 나는 다음 (위의 선언 관련) 질문

토글의 값에 따라 한 , 나는

if(toggle) { 
    thrust::device_ptr<unsigned int> outputPtrBegin(d_output); 
    thrust::device_ptr<unsigned int> outputPtrEnd((d_output + (rows * cols))); 
} 
else { 
    thrust::device_ptr<unsigned int> outputPtrBegin(d_X); 
    thrust::device_ptr<unsigned int> outputPtrEnd((d_X + (rows * cols))); 
} 

추력 호출해야하지만 컴파일 outputPtrBegin 및 outputPtrEnd이 선언되지 않은 말한다 if 문에서. 이 장치 포인터를 사용하기 전에 어떻게 선언해야합니까?

+0

스트라이드 란 무엇입니까? 초기 코드에서는 바이트 오프셋처럼 보입니다. 그렇지? – talonmies

+0

안녕하세요, 예, 그냥 오프셋입니다. 0으로 설정 한 경우에도 동일한 오류가 발생합니다. –

+0

"0으로 설정되어 있어도 동일한 오류가 발생합니다." 그게 수수께끼 야. 그렇다면 내 대답은 문제의 근본 원인을 설명하지 않습니다 (운영 규모는 분명히 다르지만).완전한 코드를 제공하면 더 좋을 것입니다. –

답변

3

이것은 잘못된 것입니다 :

thrust::device_ptr<unsigned int> outputPtrEnd((d_output + stride + (rows * cols))); 

그것은해야한다 :

첫 번째 (작업)의 예에서
thrust::device_ptr<unsigned int> outputPtrEnd((d_output + (rows * cols))); 

, 당신은 호스트 장치에서 영역을 복사합니다. 장치에서 해당 영역은 d_output에서 시작하며 길이는 rows*cols입니다. 이것은 당신이 완전히 reduce 작업을 통과하는 데이터입니다. 예, 호스트에서 data + stride으로 시작하는 지역으로 복사 되긴하지만 그건 부적절합니다. 궁극적으로 첫 번째 구현에서는 rows*cols 개 이상의 요소를 줄입니다.

두 번째 구현에서는 d_output에서 시작하여 d_output+stride+(rows*cols)으로 시작하는 축소 작업을 수행하려고합니다. 이것은 같은 크기의 작업이 아닙니다.

또한,이 대신 같은 것을 수행 할 수 있습니다 :

thrust::device_ptr<unsigned int> outputPtrBegin(d_output); 
thrust::device_ptr<unsigned int> outputPtrEnd = outputPtrBegin + (rows * cols); 
sum = thrust::reduce(outputPtrBegin, outputPtrEnd); 

두 번째 질문 (새로운 질문 새로운 질문을 게시하시기 바랍니다)에 관해서는,이 대신 :

if(toggle) { 
    thrust::device_ptr<unsigned int> outputPtrBegin(d_output); 
    thrust::device_ptr<unsigned int> outputPtrEnd((d_output + (rows * cols))); 
} 
else { 
    thrust::device_ptr<unsigned int> outputPtrBegin(d_X); 
    thrust::device_ptr<unsigned int> outputPtrEnd((d_X + (rows * cols))); 
} 

마 다음과 같이됩니다.

thrust::device_ptr<unsigned int> outputPtrBegin; 
thrust::device_ptr<unsigned int> outputPtrEnd; 
if(toggle) outputPtrBegin=thrust::device_pointer_cast<unsigned int>(d_output); 
else outputPtrBegin=thrust::device_pointer_cast<unsigned_int>(d_X); 
outputPtrEnd = outputPtrBegin + (rows * cols); 
+0

고마워요. 그것은 내 바보 같은 실수였다. 동일한 질문에 대해 다시 한 가지 질문이 있습니다. 같은 질문을 반영하도록 제 질문을 수정했습니다. 무료로 보시고 싶습니까? –

관련 문제