【发布时间】:2020-01-24 11:56:42
【问题描述】:
我想通过在设备内核中调用thrust::scatter 来实现异步(我也可以通过在另一个主机线程中调用它来实现)。 thrust::cuda::par.on(stream) 是无法从设备内核调用的主机函数。以下代码在图灵架构上使用 CUDA 10.1 进行了尝试。
__global__ void async_scatter_kernel(float* first,
float* last,
int* map,
float* output)
{
cudaStream_t stream;
cudaStreamCreateWithFlags(&stream, cudaStreamNonBlocking);
thrust::scatter(thrust::cuda::par.on(stream), first, last, map, output);
cudaDeviceSynchronize();
cudaStreamDestroy(stream);
}
我知道从设备调用时,thrust 使用动态并行性来启动其内核,但是我找不到指定流的方法。
【问题讨论】:
-
即使不指定流而只使用
thrust::device执行策略(并为动态并行提供必要的编译环境和运行环境)也会与调用线程异步 -
@RobertCrovella 我还希望我的内核与其他内核同时运行,因为我有/需要多级并发。据我所知,
thrust::device执行策略在空流上运行。我无法分析内核以查看行为,因为视觉分析器不支持 CC 7.0 或更高版本的动态并行性。我认为,要实现与其他内核的并发性,我需要能够在空流以外的流中启动它。 -
您的代码在 CUDA 10.1.243 上为我编译干净。我的猜测是您的编译命令行(您没有显示)没有正确指定 CUDA 动态并行编译所需的环境。
标签: cuda thrust dynamic-parallelism