Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Numba支持cuda协作块同步??Python numba cuda网格同步_Python_Cuda_Synchronization_Numba - Fatal编程技术网

Numba支持cuda协作块同步??Python numba cuda网格同步

Numba支持cuda协作块同步??Python numba cuda网格同步,python,cuda,synchronization,numba,Python,Cuda,Synchronization,Numba,Numba Cuda使用syncthreads()同步块内的所有线程。 如何在不退出当前内核的情况下同步网格中的所有块 在C-Cuda中,有一个cooperativeBlocks库来处理这种情况。我在Numba文档中找不到类似的东西 为什么这很重要 这类事情发生在减少的过程中,一个人在每个块中计算一些东西,然后你想找到块上的最大值 很简单,我们可以将它们作为两个单独的调用推送到流中。这可以确保在调用reduce之前,块计算全部完成 但是如果这两个操作是轻量级的,那么执行时间由设置内核决定,而不是

Numba Cuda使用syncthreads()同步块内的所有线程。 如何在不退出当前内核的情况下同步网格中的所有块

在C-Cuda中,有一个cooperativeBlocks库来处理这种情况。我在Numba文档中找不到类似的东西

为什么这很重要

这类事情发生在减少的过程中,一个人在每个块中计算一些东西,然后你想找到块上的最大值

很简单,我们可以将它们作为两个单独的调用推送到流中。这可以确保在调用reduce之前,块计算全部完成

但是如果这两个操作是轻量级的,那么执行时间由设置内核决定,而不是由操作的执行决定。如果这些都在python循环中,那么如果将循环和两个kerel调用融合到一个内核中,那么循环的运行速度可以轻松提高1000倍

for u in range(100000):
   Amax =CudaFindArrayMaximum(A)
   CudaDivideArray(A,Amax)
   CudaDoSomethingWithMatrix(A)
因为循环中的三行中的每一行都是快速内核,所以我想把它们和循环都放在一个内核中


但是如果不同步网格中的所有块,我想不出任何方法来实现这一点。事实上,出于同样的原因,即使是找到最大值的第一步本身也是很棘手的。

在CUDA中,如果不使用,就没有安全可靠的机制来进行网格范围的同步(除了使用内核启动边界)。事实上,提供这种能力是引入合作小组的动机之一

目前,numba不公开协作组功能。因此,目前在numba能力范围内没有安全可靠的方法来实现这一点


请参阅,以了解在没有协作组的情况下尝试在CUDA中执行此操作可能存在的危险示例。

您可以通过全局内存在块之间进行通信。此外,GPU以64字节之类的块读取/写入内存。因此,如果每个块写入一个或多个这样的对齐块,则不会发生冲突。不是同步,但至少


但还有另一个问题。您可以有10000个块,并且在某个时间只有30个块在工作:)。只有当其中一个完成并被原谅时,下一个区块才会开始。但在原则上,即使在这种情况下,您也可以这样组织您的工作:第一次迭代是块,例如1-1000,下一次是-1001-1500,第三次是-1501-1750,等等。要检查每个块中的必要输入数据是否准备就绪,在最坏的情况下,是否可以生成一个虚拟循环…

您找不到它,因为这些都不受支持2019年以来,该主题是否有任何更改?我需要在一个“完成的”数组上迭代数千次。我不想让for循环在python中首先谢谢。其次,我关注一个名为cuda.synchthreads_和(谓词)的numba函数。我找不到它的使用文档或示例,但这让我怀疑这是否是实现grid.sync()的途径。具体地说,让每个线程或块向全局计数器添加一个原子,然后执行synchthreads和(counter==100000)。这个想法是,当计数器等于htreads或block的总网格值时,每个块都可以继续移动。当然,如果你愿意,你可以尝试类似的方法。您需要确保仔细限制内核中线程块的数量,即使如此,这种方法通常被认为是不安全的。有关专家确定的问题的示例,请参阅第2.2节,这些问题远远超出了检查原子更新的全局变量的范围。感谢您花时间帮助我在这里学习。我按照你提供的链接阅读了它。他们没有给出一个实际的处方,但他们回应了你的担忧,即同步块是不可靠的。我很难接受没有进一步解释的答案。这是一台计算机,虽然线程可能异步运行并导致较小的浮点差异,但总体逻辑是逻辑。GPU执行逻辑。我建议的块同步要么在逻辑上正确,要么在逻辑上不正确。这不对吗?谢谢你的帮助。看起来合作小组可能要去Numba了