在OpenCL内核中,有没有任何方法可以让特定线程在某种情况下等待其他线程 __内核 无效示例(uuu全局int*a、uuu全局int*dependency、uint cols) { int j=此处的更genter code\u global\u id(0); int i=获取全局id(1); 如果(i>0&&j>0) { 而(1) { 测试=1; } //等待家属 ----------------------------- -------------------------- } }

在OpenCL内核中,有没有任何方法可以让特定线程在某种情况下等待其他线程 __内核 无效示例(uuu全局int*a、uuu全局int*dependency、uint cols) { int j=此处的更genter code\u global\u id(0); int i=获取全局id(1); 如果(i>0&&j>0) { 而(1) { 测试=1; } //等待家属 ----------------------------- -------------------------- } },opencl,Opencl,在上面的内核代码中,为什么在没有无限循环的所有线程中跳过while循环。有什么想法吗。 我正在处理一个有趣的问题,它需要一个线程根据一些条件等待其他线程完成,但是每次当它在GPU上运行时,上面的while或while(wait_条件)都会被跳过 在GPU上的OpenCL内核中,是否有其他方法使特定线程等待其他线程 提前谢谢 在高层,GPU是数据并行计算设备。他们喜欢在不同的数据上运行相同的任务。当他们的任务做不同的事情时,他们做得不好 您的代码说明了一个任务并行问题。所以我的高层次问题是你在解决

在上面的内核代码中,为什么在没有无限循环的所有线程中跳过while循环。有什么想法吗。 我正在处理一个有趣的问题,它需要一个线程根据一些条件等待其他线程完成,但是每次当它在GPU上运行时,上面的while或while(wait_条件)都会被跳过

在GPU上的OpenCL内核中,是否有其他方法使特定线程等待其他线程


提前谢谢

在高层,GPU是数据并行计算设备。他们喜欢在不同的数据上运行相同的任务。当他们的任务做不同的事情时,他们做得不好

您的代码说明了一个任务并行问题。所以我的高层次问题是你在解决什么类型的问题。?如果这是一个任务并行问题,那么GPU可能不是最好的解决方案。多核CPU会是一种替代方案吗

您的代码是典型的“旋转锁”。代码循环直到值更改。它通常用于数据库中的短期轻型锁定。即使在CPU上,这也是危险的代码,因为错误或错误可能会锁定CPU或GPU。对于CPU代码,自旋锁通常由中断计时器保护。 用法是

1) 设置计时器 2) 旋转直到值发生变化 3) 继续或超时

因此,在必要的毫秒数之后,代码被中断并抛出错误。因此,如果使用spinlock模式,为了安全起见,请在完成适当数量的循环后,在while语句中添加一个循环出口

在OpenCL简化算法中,它通常用于零线程(get_global_id(0)==0) 返回最终的单例结果。在此之前,所有线程都将使用barrier调用进行同步

__kernel void example(__global int *a, __global int *dependency, uint cols) { int j = genter code hereet_global_id(0); int i = get_global_id(1); if(i > 0 && j > 0) { while(1) { test = 1; } //Wait for the dependents ----------------------------- -------------------------- } }
在高层,GPU是数据并行计算设备。他们喜欢在不同的数据上运行相同的任务。当他们的任务做不同的事情时,他们做得不好

您的代码说明了一个任务并行问题。所以我的高层次问题是你在解决什么类型的问题。?如果这是一个任务并行问题,那么GPU可能不是最好的解决方案。多核CPU会是一种替代方案吗

您的代码是典型的“旋转锁”。代码循环直到值更改。它通常用于数据库中的短期轻型锁定。即使在CPU上,这也是危险的代码,因为错误或错误可能会锁定CPU或GPU。对于CPU代码,自旋锁通常由中断计时器保护。 用法是

1) 设置计时器 2) 旋转直到值发生变化 3) 继续或超时

因此,在必要的毫秒数之后,代码被中断并抛出错误。因此,如果使用spinlock模式,为了安全起见,请在完成适当数量的循环后,在while语句中添加一个循环出口

在OpenCL简化算法中,它通常用于零线程(get_global_id(0)==0) 返回最终的单例结果。在此之前,所有线程都将使用barrier调用进行同步

__kernel void example(__global int *a, __global int *dependency, uint cols) { int j = genter code hereet_global_id(0); int i = get_global_id(1); if(i > 0 && j > 0) { while(1) { test = 1; } //Wait for the dependents ----------------------------- -------------------------- } }
值得指出的是,并非在内核启动中排队的每个工作项都在设备上同时运行是很正常的。这意味着任何使用自旋锁方案(即使是设计正确的方案)的代码仍然可能会失败,并出现不可恢复的死锁,因为自旋工作项可能正在等待来自尚未计划好的工作项的操作。在GPU计算中,整个设备级同步的整体想法通常是不好的,如果需要,使用不同的算法或不同的体系结构可能会更好。值得指出的是,并非内核启动中排队的每个工作项都在设备上同时运行是很正常的。这意味着任何使用自旋锁方案(即使是设计正确的方案)的代码仍然可能会失败,并出现不可恢复的死锁,因为自旋工作项可能正在等待来自尚未计划好的工作项的操作。在GPU计算中,整个设备级同步的想法通常是不好的,如果您需要,使用不同的算法或不同的体系结构可能会更好。需要注意的是,
屏障
不会成为整个设备(GPU)的屏障,而只会成为工作组的屏障。有效的全局屏障仍然是一个正在进行的研究主题。需要注意的是,
屏障
不会是整个设备(GPU)的屏障,而只会是工作组的屏障。有效的全球壁垒仍然是一个正在进行的研究课题。