Поддержка Numba для синхронизации блоков cuda?Python Numba Cuda Grid Sync - PullRequest
0 голосов
/ 08 февраля 2019

В 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, даже самый первый шаг нахождения максимума сложен сам по себе по той же причине.

1 Ответ

0 голосов
/ 08 февраля 2019

В CUDA, без использования кооперативных групп , не существует безопасного или надежного механизма для выполнения синхронизации по всей сетке (кроме использования границы запуска ядра).Фактически, предоставление этой возможности было одной из мотивов введения кооперативных групп.

В настоящее время numba не раскрывает функциональность кооперативных групп.Поэтому в настоящее время не существует безопасного или надежного способа достичь этого с помощью возможностей numba.

См. этот вопрос , где приведен пример возможной опасности при попытке сделать это в CUDA без сотрудничества.группы.

...