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)
上限。我在文档中找不到任何关于此的智慧。这是正确的吗?有解决方法吗?
答案 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已修复此错误。