我想为我用OpenCL编写的程序创建一个进度条。
如果有一个工作项完成,有没有办法从内核发出某种信号? 或者以任何方式显示进度?
答案 0 :(得分:2)
不,无法知道有多少工作组/项目已完成执行。
如果您需要进度条,可能是因为它非常慢,或者您需要处理大量数据。 如果您的OpenCL应用程序非常慢,我建议您对其进行优化,因为完成一次通话的时间不应超过1秒。
但是,如果要处理大量数据,则可以将工作分成小块。然后,您可以跟踪这些块的完成情况。
答案 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修复它。