2013-07-10 2 views
1

CUDA 커널에서 2D 벡터를 배열로 변환 할 수있는 방법이 있습니까? 내가 cudaMalloc에 ​​원하는 호스트 장치에 복사std :: CUDA로 배열 할 벡터

vector<vector<int>> information; 

그것을 할 수있는 가장 좋은 방법 일 것입니다 무슨 :로

선언?

int *d_information; 
cudaMalloc((void**)&d_information, sizeof(int)*size); 
cudaMemcpy(d_information, information, sizeof(int)*size, cudaMemcpyHostToDevice); 

답변

2

한마디로, 없다. CUDA API는 완전 복사를 지원하지 않으며 std::vector에 대해서도 알지 못합니다. 당신이 호스트 소스로 벡터의 벡터를 가지고 주장하는 경우,이 같은 일을 필요로합니다 :

int *d_information; 
cudaMalloc((void**)&d_information, sizeof(int)*size); 

int *dst = d_information; 
for (std::vector<std::vector<int> >::iterator it = information.begin() ; it != information.end(); ++it) { 
    int *src = &((*it)[0]); 
    size _t sz = it->size(); 

    cudaMemcpy(dst, src, sizeof(int)*sz, cudaMemcpyHostToDevice); 
    dst += sz; 
} 

[면책 조항 : 브라우저로 작성, 컴파일 또는 테스트하지. [자체 위험에 사용]

이렇게하면 호스트 메모리가 GPU 선형 메모리의 할당으로 복사되어 각 벡터에 대해 하나의 복사본이 필요합니다. 벡터 벡터가 "들쭉날쭉 한"배열이면 GPU가 사용할 인덱스를 저장하는 것이 좋습니다.

+0

CUDA에서는 std :: vector를 사용할 수 없습니다. 추력을 사용하는 것이 도움이 될 수 있습니까? 전에는 사용 해본 적이 없지만, STL 라이브러리와 비슷하지만 CUDA에서 읽었을 때까지 읽었습니다. 어떤 조언? – BRabbit27

+1

아니요, 추력은 이에 대한 지원도하지 않습니다. 호스트 배열을'std :: vector '으로 평평하게 만들고 장치의 선형 메모리처럼 인덱싱하는 것이 훨씬 낫습니다. – talonmies

+0

@ BRabbit27 : 편집 내용이 거부 된 이유를 모르겠습니다. 맞습니다. 나는 그 코드를 브라우저에 표시했고, 그 면책 조항을 넣었을 때, 나는 정말로 그것을 의미한다. – talonmies

2

지금까지 내가 이해, 벡터의 벡터는이 분열 될 수 있으며, 연속 된 메모리에 상주 할 필요가 없습니다.

당신은 내가 두 가지 문제 중 하나를 수행 할 전송해야 메모리의 양에 따라 :

  1. 이 하나의 벡터로 당신의 기억을 다시 정렬 한 다음 cudaMemcpy를 사용합니다.
  2. 일련의 cudaMemcpyAsync을 만듭니다. 각 복사본은 벡터 벡터에서 단일 벡터를 처리 한 다음 동기화합니다.