thrust :: binary_search在运行时失败,执行策略指定用户流

时间:2018-06-05 14:43:57

标签: c++ parallel-processing cuda thrust

除了默认流之外,

thrust::binary_search段错误就我所知。我无法在文档中找到描述此类限制的任何信息,因此我希望专家可以告诉我正确使用。

这是一个简单的例子。此测试代码创建未排序整数的向量,使用推力向量复制到设备。然后,它创建一个流并使用该流进行排序。但是,如果我尝试在该流上为二进制搜索例程指定执行策略,则会出现seg错误。当然,我需要多个流来改善更复杂的并发性。

#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;
}

我在计算能力6.1设备上使用CUDA 9.1。

默认流的上限按预期工作。使用执行策略stream seg fault在thrust::cuda::par.on(stream)上限。我在文档中找不到任何关于此的智慧。这是正确的吗?有解决方法吗?

2 个答案:

答案 0 :(得分:1)

我是Thrust的维护者。由于我对CUDA 9.0中引入的Thrust的新CUDA后端进行了监督,因此这是一个不幸的错误。 TL; DR是新的CUDA后端没有任何二进制搜索算法的专业化,因此使用了通用的顺序回退。由于某种原因,当通过流执行策略时,通用后备实现会爆炸。

我正在调查第二个问题的原因,但更大的问题是第一个问题(在新的后端中没有二进制搜索算法的实现)。该修复程序不会将其纳入下一个CUDA版本中,但希望会在此之后的版本中发布。但是,在下一个CUDA版本发布后,Thrust GitHub将重新投入使用,我将能够在此部署修补程序。

不幸的是,目前,我没有其他解决方法。

GitHub Issue 921正在跟踪此错误。

答案 1 :(得分:1)

只需跟进-https://github.com/thrust/thrust/pull/1104已修复此错误。