Сбой thrust :: binary_search во время выполнения с политикой выполнения, указывающей поток пользователя - PullRequest
0 голосов
/ 05 июня 2018

thrust::binary_search segfaults для всех, кроме потока по умолчанию, насколько я могу судить.Я не могу найти какую-либо информацию, описывающую такое ограничение, в документации, поэтому я надеюсь, что эксперт сможет просветить меня о правильном использовании.

Вот простой пример.Этот тестовый код создает вектор несортированных целых чисел, копирует на устройство, используя вектор тяги.Затем он создает поток и сортирует, используя этот поток.Однако, если я пытаюсь указать политику выполнения для процедуры двоичного поиска в этом потоке, я получаю ошибку сегмента.Конечно, мне нужно несколько потоков для улучшения параллелизма в более сложном случае.

#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <thrust/binary_search.h>
#include <iostream>
int main(void)
{
   std::vector<int> data = {31, 16, 14, 55, 61, 18, 33, 88, 72};
   thrust::host_vector<int> H(data);
   thrust::device_vector<int> D = H;

   cudaStream_t stream;
   cudaStreamCreate(&stream);

   thrust::sort(thrust::cuda::par.on(stream), D.begin(), D.end());
   // So far so good
   auto it1 = thrust::upper_bound(thrust::cuda::par, D.begin(), D.end(), 50);
   // Also good
   std::cout << "Test 1 = " << *it1 << std::endl;
   // But the next call seg faults
   auto it2 = thrust::upper_bound(thrust::cuda::par.on(stream), D.begin(), D.end(), 50);
   std::cout << "Test 2 = " << *it2 << std::endl; 
   cudaStreamDestroy(stream);
   return 0;
}

Я использую CUDA 9.1 на устройстве с вычислительной возможностью 6.1.

Верхняя граница для потока по умолчаниюработает как положено.Верхняя граница stream с использованием политики выполнения thrust::cuda::par.on(stream) seg faults.Я не могу найти никакой мудрости по этому поводу в документации.Это правильно?Есть ли обходной путь?

1 Ответ

0 голосов
/ 28 июня 2018

Я хранитель Тяги.Это досадная ошибка до моего времени из-за недосмотра в новом CUDA-бэкенде для Thrust, представленном в CUDA 9.0.TL; DR заключается в том, что новый бэкэнд CUDA не имеет специализаций ни одного из алгоритмов бинарного поиска, поэтому используется общий последовательный запасной вариант.По какой-то причине универсальная резервная реализация взрывается при прохождении политики выполнения потока.

Я смотрю на причину второй проблемы, но большая проблема - первая проблема (нет реализации бинарного поискаалгоритмы в новом бекенде).Исправление не войдет в следующий выпуск CUDA, но, надеюсь, оно будет выпущено после этого.Однако после следующего выпуска CUDA Thrust GitHub вернется в строй, и я смогу развернуть там исправление.

К сожалению, в настоящее время у меня нет другого обходного пути.

GitHub Issue 921 отслеживает эту ошибку.

...