Thrust和CUDA Streams:并不总是可以避免默认流?

时间:2016-03-25 16:30:04

标签: cuda thrust cuda-streams

我的用例如下:我有一个整数数组,我想找出有多少元素>我想在非默认流上执行此操作,以使其与其他计算并行运行。到目前为止我的解决方案如下:

#include <thrust/execution_policy.h>
#include <thrust/sort.h>
#include <thrust/host_vector.h>
#include <thrust/device_vector.h>

struct less_than_zero
{
    __host__ __device__ bool operator() (int x) { return x < 0; }
};

int main()
{ 
    cudaStream_t stream;
    cudaStreamCreate(&stream);      

    //generate some data
    thrust::host_vector<int> H(4); 
    H[0] = -1; H[1] = 20; H[2] = 38; H[3] = 46; 
    thrust::device_vector<int> D = H; 

    //sort using stream
    thrust::sort(thrust::cuda::par.on(stream), D.begin(), D.end(), thrust::greater<int>());

    //find smallest index with data < 0  
    thrust::device_vector<int>::iterator iter1 = D.begin();
    thrust::device_vector<int>::iterator iter2 = thrust::find_if(thrust::cuda::par.on(stream), D.begin(), D.end(), less_than_zero());

    std::cout << "entries > 0:" << thrust::distance(iter1, iter2);

    cudaStreamDestroy(stream);
    return 0;
}

排序和找到第一个元素&lt; 0在流上按预期工作。但是看看Nsight的时间轴输出,一些东西(复制设备到主机和推力内核)后来发生在默认流上(这显然破坏了这个练习的目的,因为默认流等待所有其他流完成之前它开始做任何事情)。 我的假设是迭代器必须被复制并且推力不会为此目的获取主机上的固定内存,所以它只是在默认流上执行此操作。我还没有找到解决办法。我无法在设备上声明迭代器:

__device__ thrust::device_vector<int>::iterator it;

因为这会导致编译时错误: error : dynamic initialization is not supported for __device__, __constant__ and __shared__ variables.

是否可以强制推力将find_if的结果存储在设备内存中以充分利用多流方法,还是需要针对此功能实现不同的实现?

0 个答案:

没有答案