监控OpenCL内核的进度

问题描述 投票:3回答:2

我想为我用OpenCL编写的程序创建一个进度条。

如果一个工作项完成,有没有办法从内核发出某种信号? 或者以任何方式来展示进展?

c++ c opencl
2个回答
2
投票

不,无法知道有多少工作组/项目已完成执行。

如果您需要进度条,可能是因为它非常慢,或者您需要处理大量数据。如果您的OpenCL应用程序非常慢,我建议您对其进行优化,因为完成一个呼叫所需的时间不应超过1秒。

但是,如果要处理大量数据,则可以将工作分成小块。然后,您可以跟踪这些块的完成情况。


0
投票

一个不那么健壮的解决方案是使用host_ptr变量,使用CL_MEM_ALLOC_HOST_PTR标志,让内核修改指针,然后在主机端,使用while循环测试这个指针并使用该值来打印进度条,

这是宣言https://github.com/fangq/mcxcl/blob/master/src/mcx_host.cpp#L428-L431

这是内核https://github.com/fangq/mcxcl/blob/master/src/mcx_core.cl#L845-L848内部的更新

这里是主机端值检索和进度条打印https://github.com/fangq/mcxcl/blob/master/src/mcx_host.cpp#L583-L606

这在AMD GPU上运行正常(更新有点稀疏,进度变量仅在内核运行时更新几次,导致进度条中的非偶数跳转)。但是,对于nvidia和intel设备,在内核完成之前,这不会打印任何内容。

在这里尝试我的代码

git clone https://github.com/fangq/mcxcl.git
cd mcxcl/src
make clean all
cd ../example/quicktest
./run_qtest.sh -D P

我在NVIDIA的论坛上问了这个问题,但没有人知道如何为nvidia修复它。

https://devtalk.nvidia.com/default/topic/1031335/cuda-programming-and-performance/how-to-update-host-memory-variable-from-device-to-host-during-kernel-execution-in-opencl/

© www.soinside.com 2019 - 2024. All rights reserved.