繁体   English   中英

如何在 kernel 启动后让 CUDA 返回控制?

[英]How can I make CUDA return control after kernel launch?

这可能是一个愚蠢的问题,但有没有办法从 kernel 异步返回? 例如,我有这个 kernel 执行第一次 stream 压缩,输出给用户,但在它必须执行第二次 stream 压缩之前更新其内部结构。

在 GPU 在后台继续其第二次 stream 压缩完成后,有没有办法将控制权返回给用户? 当然,第二个 stream 压缩仅适用于共享 memory 和全局 memory,但用户不应检索任何内容。

我不能使用推力。

GPU kernel 本身并不从“用户”那里获得控制权,即从系统上的 CPU 线程与 GPU 进行控制。

但是,对于 CUDA 的运行时,调用 GPU kernel 的默认方式让您的线程等待内核执行结束:

my_kernel<<<my_grid_dims,my_block_dims,dynamic_shared_memory_size>>>(args,go,here);

但您也可以使用 这些是硬件支持的执行队列,您可以在其中异步排队工作(内存复制、kernel 执行等),就像您问的那样。

在这种情况下,您的启动可能如下所示:

cudaStream_t my_stream;
cudaError_t result = cudaStreamCreateWithFlags(&my_stream, cudaStreamNonBlocking);  
if (result != cudaSuccess) { /* error handling */ }

my_kernel<<<my_grid_dims,my_block_dims,dynamic_shared_memory_size,my_stream>>>(args,go,here);

有很多关于使用流的资源; 试试这个博客文章作为初学者。 CUDA 编程指南有很大一部分是关于异步执行的。

流和各种库

Thrust提供异步功能已经有一段时间了,使用了thrust::future和其他结构。 这里

My own Modern-C++ CUDA API wrappers make it somewhat easier to work with streams, relieving you of the need to check for errors all the time and to remember to destroy streams and release memory before it goes out of scope. 使使用流更容易一些。 这个例子 语法看起来像这样:

auto stream = device.create_stream(cuda::stream::async);
stream.enqueue.copy(d_a.get(), a.get(), nbytes);
stream.enqueue.kernel_launch(my_kernel, launch_config, d_a.get(), more, args);

(并且错误引发异常)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM