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.Я не могу найти никакой мудрости по этому поводу в документации.Это правильно?Есть ли обходной путь?