2012-12-10 2 views
1

는 I이 보이는 CPU 측의 데이터 소스를 말한다 들쭉날쭉 한).행함으로써 2D AMP 어레이 행을 채우기

배열 내에서 GPU 메모리의 단일 블록으로 복사하고 싶습니다. 행별로이 행을 수행하는 방법이 있습니까? 다음과 같은 것 :

array<int, 2> gpuArray(cpuBlobOData.size(), numColumns); 
for(size_t i=0; i<cpuBlobOData.size(); ++i) 
{ 
    auto cpuRow = cpuBlobOData[i]; 
    concurrency::copy(cpuRow.begin(), cpuRow.end(), &gpuArray[i]); 
} 

나는 이것이 컴파일되지 않는다는 것을 알기 때문에 내가하려고하는 것을 보여줍니다. 이 일을 성취 할 수있는 것이 있습니까? 내가 찾을 수있는 유일한 해결책은 1D 벡터에 cpu 벡터를 복사하고이를 array_view에 매핑하거나 배열에 복사하는 것이 었습니다.

효과가 있지만 낭비적이고 일부 알고리즘의 경우 연속 1D 벡터가 나머지 메모리 공간에 맞지 않을 수 있습니다.

내가 AMP를 알아 내려고 애쓰는 가운데 어떤 조언도 환영합니다.

답변

2

예, 행 단위로 복사 할 수 있습니다. 귀하의 솔루션은 동시성 :: 사본 라인에 gpuArray에서 '&'을 제거, 거의가 :

array<int, 2> gpuArray(cpuBlobOData.size(), numColumns); 
for(size_t i=0; i<cpuBlobOData.size(); ++i) 
{ 
    auto cpuRow = cpuBlobOData[i]; 
    concurrency::copy(cpuRow.begin(), cpuRow.end(), gpuArray[i]); 
} 

무엇 발생하는 첨자 연산자를 사용하여 액세스 array<int,2>는 'I'행을 나타내는 array_view<int,1>를 반환한다는 것입니다, 이것은 "프로젝션"이라고합니다. 자세한 내용은 a blog post that covers C++ AMP projections in details을 확인하십시오.

+0

감사합니다. 성능이 떨어지는 것을 제외하고는 효과가 있었기 때문에 큰 중간 메모리 블록을 고수했습니다. –