В Numba Cuda есть syncthreads () для синхронизации всех потоков внутри блока.Как я могу синхронизировать все блоки в сетке , не выходя из текущего ядра?
В C-Cuda есть библиотекаlabotiveBlocks для обработки этого случая.Я не могу найти что-то подобное в Numba Docs.
Почему это имеет большое значение !
Подобные вещи происходят в сокращениях, когда каждый вычисляет что-то в каждом блоке, а затем вы хотите найти максимум по блокам.
Обычно их можно вставить в поток как два отдельных вызова.Это гарантирует, что все вычисления блока завершены перед вызовом, чтобы уменьшить.
Но если эти две операции облегчены, тогда время выполнения преобладает за счет установки ядер , а непо выполнению операций.Если они находятся внутри цикла Python, цикл может легко выполняться в 1000 раз быстрее, если цикл и два вызова kerel могут быть объединены в одном ядре
for u in range(100000):
Amax =CudaFindArrayMaximum(A)
CudaDivideArray(A,Amax)
CudaDoSomethingWithMatrix(A)
, так как каждая из трех строк в цикле быстраяядра, я хотел бы поместить их и цикл в одно ядро.
Но я не могу придумать способ сделать это без синхронизации по всем блокам сетки.INdeed, даже самый первый шаг нахождения максимума сложен сам по себе по той же причине.