2010-03-08 7 views
2

다음 코드 조각, 추력을 사용하여 CUDA와 코드 사전의 종류를 생성 (CUDA를위한 C++ 템플릿 라이브러리)을 감안할 때 :최적화 CUDA

thrust::device_vector<float> dCodes(codes->begin(), codes->end()); 
thrust::device_vector<int> dCounts(counts->begin(), counts->end()); 
thrust::device_vector<int> newCounts(counts->size()); 

for (int i = 0; i < dCodes.size(); i++) { 
    float code = dCodes[i]; 
    int count = thrust::count(dCodes.begin(), dCodes.end(), code); 

    newCounts[i] = dCounts[i] + count; 

    //Had we already a count in one of the last runs? 
    if (dCounts[i] > 0) { 
     newCounts[i]--; 
    } 

    //Remove 
    thrust::detail::normal_iterator<thrust::device_ptr<float> > newEnd = thrust::remove(dCodes.begin()+i+1, dCodes.end(), code); 
    int dist = thrust::distance(dCodes.begin(), newEnd); 
    dCodes.resize(dist); 
    newCounts.resize(dist); 
} 

codes->resize(dCodes.size()); 
counts->resize(newCounts.size()); 

thrust::copy(dCodes.begin(), dCodes.end(), codes->begin()); 
thrust::copy(newCounts.begin(), newCounts.end(), counts->begin()); 

문제는 내가 했으므로입니다 CUDA 시각적 프로파일 러를 사용하여 4 바이트의 다중 복사본을 발견했습니다. IMO이

  1. 루프 카운터에 의해 생성되는 I
  2. 플로트 코드, INT 카운트DIST
  3. I에 대한 모든 액세스
위에서 언급 변수 이 모든 것을 천천히 보인다

(연속 copyin 4 바이트의 g는 재미 없다 ...).

그래서, 이러한 변수는 장치에서 처리되어야한다고 추력을 말하는거야 어떻게? 아니면 이미? 내가 루프에 대한 주위 (또한 slowliness 또 다른 이유가 될 수있는) 호스트 또는 디바이스에서 실행 여부를 확실하지 않다 때문에 추력 :: device_ptr를 사용

는 나를 위해 충분하지 보인다.

답변

5

i, 크기, 색인, 코드 등을 반복 할 때마다 호스트에서 장치로 복사해야합니다. 프로그램 사용 방법은 많지 않습니다. 최상의 결과를 얻으려면 장치에서 전체 i 루프를 이동하는 것을 고려하십시오.이 방법으로 장치 대본을 호스트 할 수 없습니다.

신뢰는 성능에 관한 알고리즘은 매우 맞게 사용할 수있는 기능, 당신은 명시 적으로 추력 알고리즘을 사용하지 않고 최상의 성능을 재 작성해야 할 수도 없습니다 그러나 여기서 몇 가지에 좋은 곳입니다.

+1

내가 필요한 모든 것을 복사하는 추력을 사용하여 완전히 새로운 장치 코드로 해결. –