2013-02-10 3 views
1

한 번에 여러 개의 데이터를 호스트의 장치에 복사하거나 일련의 청크로 순서대로 복사하려면 알고리즘에 영향을 미칩니다. 내 질문은 어느 것이 더 많은 오버 헤드를 가지고 있는가? , 둘 이상의 복사 작업을 호출하는 것이 다른 것보다 더 많은 오버 헤드가 있다고 생각합니다. 그러나 나는 단지이 개념을 더 자세히 알고 싶다. (생각은은 일반적으로 현실과 맞지 않는다. :)). 문서 정렬에 대한 참조를 표시 할 수 있다면 정말 감사하겠습니다!한꺼번에 대량의 데이터를 전역 메모리에 복사하기 CUDA에서

친절 감사, 케르

+0

당신이 "오버 헤드"를 말할 때, 당신은 고정 데이터 크기 독립적 인 지연, 또는 뭔가에 대해 물어? – talonmies

+0

아니요! 전적으로 크기 독립적 (크기가 크거나 작은 것은 중요하지 않음). 호스트에서 장치로 복사 할 바이트 수가 N이라고 가정 해 봅시다. 내 질문은 어느 것이 더 빠릅니까? 한 번에 N 바이트를 모두 복사하거나 복사 (N/K), 복사 (N/K), 즉 K 회 복사 기능을 실행하는 일련의 청크로 복사합니다. 나는 후자가 훨씬 더 비싸다고 생각한다; 그러나 이전의 것보다 얼마나 더 비쌉니까? 일련의 바이트 청크로 복사하는 경우 한 번에 복사하는 것보다 비용이 1.2 배 높습니다. 그럼 내가 후자의 솔루션 (청크의 시리즈로 복사)에 대한 선택할 수 있습니다. – iliTheFallen

답변

1

사본 (기본값) 동기 경우, 그들은 GPU가 반환하기 전에 유휴 상태가 될 때까지 각 복사 기능은 대기 때문에 더 많은 오버 헤드를 발생 않습니다. 복사본이 비동기식이라면 오버 헤드는 수십 마이크로 초이며 작은 memcpy에서만 볼 수 있습니다.

NULL 스트림과 함께 비동기 memcpy를 지정할 수 있으며 CPU/GPU 동시성의 이점을 얻을 수 있습니다. (예 : GPU가 이전 GPU를 처리하는 동안 CPU가 다음 memcpy를 시작할 수 있습니다.)

CUDA 핸드북 (전체 내용의 이해를 돕기 위해 필자가 작성한 것으로 써야 함)은 6 장에서이 문제를 다룹니다. 소스 코드에는 memcpy를 호출하는 오버 헤드를 숨기는 memcpy의 크기를 측정하는 앱이 포함되어있다. 저장소에 breakevenMemcpyHtoD.cu을 체크 아웃 :

https://github.com/ArchaeaSoftware/cudahandbook/tree/master/concurrency

+0

정말로 감사합니다. 글쎄, 나는 네가 무슨 뜻인지 안다. 그러나 나는 NULL 스트림을 전달할 수 없다, 나는 (당신이 코드에서했던 것처럼) 믿는다; 복사 작업이 완료되었다는 알림을 받아야하기 때문입니다. 사실,이 질문을하는 나의 목표는 CPU와 GPU를 항상 바쁘게 유지하고 비동기 복사가 나에게 유일한 방법 인 것처럼 보였습니다. 그러나 나를 위해 또 다른 가능성이있었습니다. 즉, CPU 측의 코드가 특정 레벨에 도달 할 때까지 데이터를 축적 할 수있었습니다. 그런 다음 일련의 청크 대신 대량으로 복사 할 수 있습니다. 이제 좀 더 명확 해지기를 바랍니다 :) – iliTheFallen

+0

비동기 복사는 CPU와 GPU를 동시에 사용하도록 유지하는 유일한 방법이며,이 경우 CPU/GPU 동기화도 수행해야합니다. 동기화를 수행하기 위해 CUDA 이벤트를 사용하여 *와 * 둘 다 동기화 할 수 있습니다. – ArchaeaSoftware

+0

아우, 미안해. 네, 네가 맞아, 시내가 아니라면 사건이 있었을거야 ... 미안해.) ... 다른 한편으로는, 내가 데이터가 호스트 측에 누적 될 때까지 기다려야한다고 생각하니? 특정 금액에 도달 할 수있다. 그럼 난 여전히 비동기로 복사 할 수 있습니다. 이 방법으로, 나는 "memcpyAsync"를 K times (M << K)보다 상대적으로 작은 M 번 호출하여 내가 언급 한 데이터를 복사합니다. 그 논리가 맞습니까? 아니면 단지 몇 마이크로 초 동안 데이터를 축적하기 위해 복잡성을 추가하여 코드를 복잡하게하지 말고 단순히 K 회 동안 memcpyAsync를 호출하십시오. – iliTheFallen