2014-08-28 5 views
3

다음 코드가 주 끝에 충돌하는 이유는 무엇입니까?전역 변수로 thrust device_vector 사용

#include <thrust/device_vector.h> 

thrust::device_vector<float4> v; 

int main(){ 
    v.resize(1000); 
    return 0; 
} 

오류 :

terminate called after throwing an instance of 'thrust::system::system_error' 
what(): unspecified driver error 

내가 host_vector 대신 device_vector 코드 실행 벌금을 사용하는 경우.

당신은 이것이 스러스트 버그라고 생각합니까, 아니면 제가 여기서 뭔가 잘못하고 있습니까?

나는 우분투 10.10에서 쿠다 4.0으로, 윈도우 7에서는 쿠다 6.5로 시도했다. 추력 버전은 두 경우 모두 1.7입니다.

감사합니다.

+3

@RobertCrovella : 여기서 일어나는 일이 아닙니다. 이것은 벡터가 범위를 벗어나서 CUDA 컨텍스트가 붕괴 된 후에 파괴되기 때문에 발생합니다. 그래서 효과적으로 cudaFree가 작동중인 런타임 API 연결없이 호출되어 런타임 오류가 발생합니다. – talonmies

답변

4

이 문제는 추력의 버그도 아니며 잘못된 것입니다. 오히려 이것은 CUDA 런타임 API 설계의 한계입니다.

크래시의 근본적인 원인은 변수가 범위를 벗어 났을 때 thrust::vector의 소멸자가 호출된다는 것입니다. 이는 CUDA 런타임 API 컨텍스트가 제거 된 후에 발생합니다. 프로세스가 cudaFree을 CUDA 드라이버에서 이미 연결 해제 한 후에 호출하려고하기 때문에 런타임 오류 (아마도 cudaErrorCudartUnloading)가 생성됩니다.

번역 단위 범위 main()에 선언 된 추력 장치 용기를 사용하는 것 이외의 해결 방법을 알지 못합니다.

관련 문제