如何告诉 PyCUDA 重用早期内核的内存?

发布于 2025-01-01 21:55:10 字数 278 浏览 0 评论 0原文

我的程序有两个内核,第二个内核应该使用已经上传的输入数据和第一个内核的结果,这样我就可以节省内存传输。我该如何存档这个?

这就是我启动内核的方式:

result = gpuarray.zeros(points, dtype=np.float32)  

kernel(
    driver.In(dataT),result,np.int32(points),
    grid = (blocks,1),
    block = (block_size, 1, 1),
)

My program has two kernels and the second kernel should use the already uploaded input data and the results from the first kernel, so I can save the memory transfers. How would I archive this?

This is how I launch my kernels:

result = gpuarray.zeros(points, dtype=np.float32)  

kernel(
    driver.In(dataT),result,np.int32(points),
    grid = (blocks,1),
    block = (block_size, 1, 1),
)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

情绪失控 2025-01-08 21:55:10

在 pycuda 中,除非您明确请求,否则您不会与设备传输数据。
例如,如果您使用以下方式分配内存并将一些数据传输到 GPU:

result = float64(zeros( (height,width) )
result_device = gpuarray.to_gpu(result)

变量 result_device 是对 GPU 中数据的引用。您可以将 result_device 传递给任何其他内核,而不会导致内存传输回 CPU。
在这种情况下,当您调用以下命令时,内存传输将再次发生:

result = result_device.get()

In pycuda you won't transfer data to and from the device unless you explicitly request it.
For example, if you allocate memory and transfer some data to the GPU with:

result = float64(zeros( (height,width) )
result_device = gpuarray.to_gpu(result)

The variable result_device is a reference to the data in the GPU. You can pass result_device to any other kernel without incurring a memory transfer back to the CPU.
In this case a memory transfer will happen again when you call:

result = result_device.get()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文