문제

다음 코드가 주어지면 CUDA를 사용하여 CUDA (CUDA 용 C ++ 템플릿 라이브러리)를 사용하여 일종의 코드 사전을 생성합니다.

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 Visual Profiler를 사용하여 4 바이트의 여러 사본을 발견했다는 것입니다. IMO 이것은 생성됩니다

  1. 루프 카운터
  2. 플로트 코드, int count 그리고 dist
  3. 모든 액세스 위에서 언급 한 변수

이것은 모든 것을 늦추는 것 같습니다 (4 바이트의 순차적 복사는 재미가 없습니다 ...).

그렇다면 어떻게 추력을 말하는지, 이러한 변수는 장치에서 처리되어야합니까? 아니면 이미입니까?

스러스트 :: device_ptr을 사용하면 나에게 충분하지 않은 것 같습니다. 호스트 또는 장치에서의 루프가 실행되는지 여부는 확실하지 않기 때문입니다 (또한 느린 느낌의 또 다른 이유가 될 수도 있습니다).

도움이 되었습니까?

해결책

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

신뢰는 성능에 관심이 있고 알고리즘이 사용 가능한 기능에 적합하지 않은 경우에도 적합합니다. Thrust 알고리즘을 명시 적으로 사용하지 않고 최상의 성능을 다시 작성해야 할 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top