有什么方法可以阻止OpenCL内核的执行吗
Is there any way to stop OpenCL kernel from execution?
有什么方法可以阻止OpenCL内核的执行吗?例如,我启动内核,进行一些计算,然后在满足某些条件时停止它,否则,我会等待它完成:
clEnqueueNDRange(queue, ...); // start kernel function
// do other stuff...
// ...
if (some condition met) {
stopKernel();
} else {
clFinish(queue);
}
感谢您的帮助
否。一旦您将内核排入队列,它就会运行到完成。
实现类似上面的东西的一种方法是这样做:
while ( data_left_to_process ) {
clEnqueueNDRangeKernel( ..., NDRange for a portion of the data, ... )
// other work
if (condition) {
break;
}
// adjust NDRange for next execution to processes the next part of your data
}
clFinish(queue);
这使您可以避免处理所有数据,但有一个明显的折衷方案,即您现在以较小的块提交工作,这可能会对性能产生影响。
可能。
- 在一个上下文中创建两个命令队列
- 创建两个内核,一个用来完成工作,另一个用来停止执行。每个内核都可以访问一个共享的全局缓冲区
- 将第一个内核加载到队列1中
- 当您想停止执行时,将第二个内核加载到队列2中
或者,您可以使用一个无序队列,并将第二个内核加载到同一个命令队列中以停止执行。您必须更加小心(根据需要使用clFinish/clFlush),但这是一种更自然的方法。
一些伪代码(用于多个队列):
clEnqueueNDRange(queue1, kernel1, ...); //start work kernel
// do other stuff
// ...
if (condition)
clEnqueueNDRange(queue2, kernel2, ...); //stop work kernel
clFinish(queue1);
clFinish(queue2); // entirely unnecessary if using in-order queues
使用int或float缓冲区作为停止变量,并通过内核中的global_id访问它们,以降低在循环中从global读取的成本。不利的一面是,您的状态将是不确定的:如果没有更多的变量来计算执行等,您将不知道有多少工作项以及哪些工作项已经执行。
内核:
void kernel1( ... ,global int * g_stop)
{
int index_from_ids = ...;
while (g_stop[index_from_ids] == 0) // or 'if' for single pass execution
{
// do work here
}
}
void kernel2( ... ,global int * g_stop)
{
int index_from_ids = ...;
g_stop[index_from_ids] = 1;
}
一种方法是分块完成工作负载,因此如果您有一个10000X10000的全局工作者,例如:
clEnqueueNDRangeKernel(queue, kernel, 2, NDRange(0,0), NDRange(10000,10000),... );
你可以分块来做,就像这样:
for(int i=0; i<100; i++)
for(int j=0; j<100; j++)
if(condition)
clEnqueueNDRangeKernel(queue, kernel, 2, NDRange(i*100,j*100),DRange(100,100),... );
在某些情况下,您可能需要在循环中调用queuefinish。这还有其他优点,比如不会在硬件中获得超时,从而终止耗时过长的应用程序,比如nvidia的看门狗计时器,如果需要,它还允许您在GUI中实现加载条。
相关文章:
- OpenCL 内核参数中的字符***?
- OpenCL 是否支持向量作为内核参数?
- openCL 内核返回垃圾值,尽管没有错误
- OpenCL 内核计时测量 0 秒或导致 SIGABRT
- OpenCL 在 NVIDIA 和 Intel GPU 上启动内核时CL_INVALID_COMMAND_QUEUE
- 将 C++ 库包含在 OpenCL 内核中?
- 在 OpenCL 内核中实现半精度浮点数据类型
- 在 Radeon 卡上并行执行多个 OpenCL 内核
- OpenCL内核是异步执行的吗
- 我可以为nVIDIA GPU编写OpenCL-C++内核吗
- 将 stl 数据结构传递给 opencl 内核
- 如何在 openCL 的内核调用中指定数字多维
- 如何提高此 OpenCL 缩减内核代码的性能?
- 将 std::vector 传递给 openCL 内核C++绑定
- OPENCL:可以将模板对象作为内核参数,并使用boost :: Compute
- OpenCL - 内核方法返回意外结果
- 是否可以在同一设备缓冲区上一个接一个地调用 OpenCL 内核?
- 如何在 OpenCL 内核中包含 C++ 类
- 特定的OpenCL内核在移动和PC上的性能不同
- opencl openGL互操作内核参数用于读取 写入