Оптимизируйте CUDA с помощью Thrust в цикле - PullRequest
2 голосов
/ 09 марта 2010

Учитывая следующий фрагмент кода, создание своего рода словаря кода с CUDA с использованием thrust (библиотека шаблонов 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());

Проблема в том, что я заметил несколько копий по 4 байта, используя визуальный профилировщик CUDA. ИМО это генерируется

  1. Счетчик петель i
  2. код с плавающей запятой , int count и dist
  3. Каждый доступ к i и переменным, указанным выше

Это, кажется, замедляет все (последовательное копирование 4 байтов не весело ...).

Итак, как мне сказать, что эти переменные должны обрабатываться на устройстве? Или они уже?

Использование thrust :: device_ptr мне кажется недостаточным, потому что я не уверен, работает ли цикл for на хосте или на устройстве (что также может быть другой причиной медлительности).

1 Ответ

5 голосов
/ 09 марта 2010

для каждого повторения i, размер, индекс, код и т. Д. Должны быть скопированы с хоста на устройство. как у вас есть ваша программа, вы ничего не можете сделать. Для достижения наилучших результатов рассмотрите возможность перемещения всей петли i на устройстве, чтобы у вас не было копий с хоста на устройство.

Доверие хорошо для некоторых вещей, однако, если речь идет о производительности, а алгоритм не совсем подходит для доступных функций, вам, возможно, придется переписать для лучшей производительности, не используя явные алгоритмы тяги.

...