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 스트림은 어떤 것과도 겹칠 수 없습니까? 그리고 어떻게이 문제를 해결할 수 있을까요?
그러나 추력의 모든 다음 버전을 변경해야합니다. 제가 이해하는 바와 같이, 주요 문제는 알고리즘 (추력)이 제로 스트림에서 실행된다는 것입니다. 그리고이 경우, 추력을 변경하지 않으면 별도의 CPU 스레드에서 병렬로 데이터 비동기 대처 (cudaMemcpyAsync)를 시작하면 도움이되지 않습니까? – Alex
아니요. 여러 호스트 스레드가 컨텍스트를 동시에 공유 할 수 없습니다. 이미 말했듯이, 추력은 이것을 지원하지 않으며 자신의 코드를 쓰지 않고도이 한계를 극복 할 수 없습니다 (동등하게 추력을 직접 수정). 추력은 궁극적 인 성능이 아닌 편의성과 사용 편의성을 고려하여 설계되었습니다. – talonmies