2011-05-16 5 views
0

크기가 H * W * sizeof (float) 인 단일 malloc 인 장치에 할당 된 메모리가 있습니다.공유 메모리 복사본에 대한 cudaMemcpy2D

이것은 H * W 행렬을 나타내는 것입니다.

행렬의 사분면을 교체해야하는 코드가 있습니다. 이 작업을 수행하기 위해 cudaMemcpy2D를 사용할 수 있습니까? 방금 spitch와 dpitch를 W * sizeof (float)로 지정하고이를 수행하기 위해 매트릭스의 각 사분면에 대한 포인터를 사용해야할까요?

또한 이러한 cudaMemcpy가 메모리 영역이 중복되지 않는다고 말하면 src와 dst가 전혀 겹칠 수 없다는 뜻입니까? 마찬가지로, 내가 한 번 왼쪽으로 옮기고 싶었던 10 바이트 너비의 배열을 가지고 있다면 - 실패 할 것입니다.

감사

답변

2

당신은 큰 투구 선형 메모리 할당의 일부 서브 블록 주위에 이동 cudaMemcpy2D를 사용할 수 있습니다. 그렇게하는 데 아무런 문제가 없습니다. 겹치지 않는 요구 사항은 협상 할 수 없으며 시도 할 경우 실패합니다. 소스와 대상은 동일한 할당에서 나올 수 있지만 소스와 대상의 주소 범위는 겹칠 수 없습니다. 오버랩이있는 곳에 "in-situ"복사를해야한다면 커널을 작성하는 것이 더 나을 것입니다 (SDK의 매트릭스 전치 예제를 참고하십시오).

1

이 행렬 조작을 수행하기 위해 간단한 커널을 작성하는 것이 좋습니다. 나는 cudaMemcpy (2D)를 사용하는 것보다 쓰기가 더 쉬울 것이라고 생각하며, 좋은 메모리 일관성을 얻기 위해 그것을 작성한다고 가정 할 때 거의 빠릅니다.

아마도 입력 행렬이 겹치지 않도록 out-of-place 변환 (즉, 다양한 입력 및 출력 배열)을하는 것이 가장 쉽습니다. 각 스레드는 단순히 입력 오프셋을 읽고 변환 된 오프셋에 기록합니다.

매트릭스 전치와 비슷합니다. CUDA SDK에는 a matrix transpose example이 있습니다.