추력 라이브러리를 사용하여 배열의 합계 (이미 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 문에서. 이 장치 포인터를 사용하기 전에 어떻게 선언해야합니까?
스트라이드 란 무엇입니까? 초기 코드에서는 바이트 오프셋처럼 보입니다. 그렇지? – talonmies
안녕하세요, 예, 그냥 오프셋입니다. 0으로 설정 한 경우에도 동일한 오류가 발생합니다. –
"0으로 설정되어 있어도 동일한 오류가 발생합니다." 그게 수수께끼 야. 그렇다면 내 대답은 문제의 근본 원인을 설명하지 않습니다 (운영 규모는 분명히 다르지만).완전한 코드를 제공하면 더 좋을 것입니다. –