Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top