2012-08-16 2 views
2

asyncEngineCount = 1 인 GPU GeForce GTX 460SE에 (CUDA C++) 추력을 사용합니다. GPU에서 /로 GPU로 전송하는 데이터를 중첩하여 단일 커널을 실행할 수 있다는 것을 알고 있습니다. 하지만 사용할 때 커널을 실행, GPU에서 전송 이전에 GPU : I는 엔비디아 비주얼 프로파일에서 보는 바와 같이추력 알고리즘을 실행하여 전송 데이터를 겹치게하려면 어떻게해야합니까?

cudaStream_t Stream1, Stream2; 
cudaStreamCreate(&Stream1); 
cudaStreamCreate(&Stream2); 
cudaMemcpyAsync(thrust::raw_pointer_cast(d_vec_src.data()), host_ptr1, test_size, cudaMemcpyHostToDevice, Stream1); 
cudaMemcpyAsync(host_ptr2, thrust::raw_pointer_cast(d_vec_dst.data()), test_size, cudaMemcpyDeviceToHost, Stream2); 
thrust::sort(d_vec_dst.begin(), d_vec_dst.end()); 
cudaThreadSynchronize(); 

추력 알고리즘, 그것을 순차적으로 실행한다. 아마도 이것은 추력 알고리즘이 제로에서 실행되기 때문일 수 있습니다. 0 스트림은 어떤 것과도 겹칠 수 없습니까? 그리고 어떻게이 문제를 해결할 수 있을까요?

답변

3

추력은 현재 알고리즘의 실행 스트림을 제어하는 ​​메커니즘을 가지고 있지 않으므로 현재 코드 기반으로 요구하는 것을 수행 할 수 없습니다. 스트림 (예 : this google groups thread)을 받아들이도록 사용자가 추력 코드베이스를 수정했지만 사용하는 알고리즘의 복잡성과 구조에 따라 실행 가능할지 여부는 다를 수 있습니다. 일부 알고리즘에는 내부 데이터 전송 기능이 있기 때문에 직렬에서 비동기 실행으로 이동할 때 문제가 발생하지 않도록 매우주의해야합니다. 사람이 여전히 검색을 위해

+0

그러나 추력의 모든 다음 버전을 변경해야합니다. 제가 이해하는 바와 같이, 주요 문제는 알고리즘 (추력)이 제로 스트림에서 실행된다는 것입니다. 그리고이 경우, 추력을 변경하지 않으면 별도의 CPU 스레드에서 병렬로 데이터 비동기 대처 (cudaMemcpyAsync)를 시작하면 도움이되지 않습니까? – Alex

+0

아니요. 여러 호스트 스레드가 컨텍스트를 동시에 공유 할 수 없습니다. 이미 말했듯이, 추력은 이것을 지원하지 않으며 자신의 코드를 쓰지 않고도이 한계를 극복 할 수 없습니다 (동등하게 추력을 직접 수정). 추력은 궁극적 인 성능이 아닌 편의성과 사용 편의성을 고려하여 설계되었습니다. – talonmies

4

는, 지금 supports streams.

cudaStream_t s; 
cudaStreamCreate(&s); 
thrust::sort(thrust::cuda::par(s), keys.begin(), keys.end()); 
cudaStreamSynchronize(s); 
cudaStreamDestroy(s); 

편집 추력 믿고 : 나는 구문이 지금 최신 커밋에 thrust::cuda::par.on(s)로 변경되었습니다 생각합니다.