gpt4 book ai didi

opencl - 如何避免在 OpenCL 中回读

转载 作者:行者123 更新时间:2023-12-01 15:07:25 25 4
gpt4 key购买 nike

我正在使用 OpenCL 实现一个算法。我将在 C++ 中循环多次并每次调用相同的 OpenCL 内核。内核将生成下一次迭代的输入数据和这些数据的数量。目前,我在每个循环中读回这个数字有两种用法:

  1. 我使用这个数字来决定下一个循环需要多少工作项;和
  2. 我使用这个数字来决定何时退出循环(当数字为 0 时)。

我发现读取占用了循环的大部分时间。有什么办法可以避免吗?

一般来说,如果你需要重复调​​用一个内核,并且退出条件依赖于内核生成的结果(不是固定次数的循环),你如何才能高效地做到这一点?有没有类似 OpenGL 中的遮挡查询的东西,你可以只做一些查询而不是从 GPU 读回?

最佳答案

从 GPU 内核读回一个数字总是需要 10 到 1000 微秒或更多。

如果控制数一直在减少,您可以保留在全局内存中,并根据全局 id 对其进行测试,并确定内核在每次迭代中是否正常工作。使用全局内存屏障同步所有线程 ...

kernel void x(global int * the_number, constant int max_iterations, ... )
{
int index = get_global_id(0);
int count = 0; // stops an infinite loop

while( index < the_number[0] && count < max_iterations )
{
count++;
// loop code follows

....

// Use one thread decide what to do next
if ( index == 0 )
{
the_number[0] = ... next value
}

barrier( CLK_GLOBAL_MEM_FENCE ); // Barrier to sync threads
}
}

关于opencl - 如何避免在 OpenCL 中回读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11585934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com