2012-08-14 3 views
7

Этот вопрос связан с использованием Cuda потоков для запуска многих ядерКак уменьшить CUDA синхронизировать задержки/задерживать

В CUDA есть много синхронизации команд cudaStreamSynchronize, CudaDeviceSynchronize, cudaThreadSynchronize, , а также cudaStreamQuery, чтобы проверить, потоки пусты.

Я заметил при использовании профилировщика, что эти команды синхронизации вводят большую задержку в программу. Мне было интересно, знает ли кто-нибудь какие-либо способы уменьшить эту задержку, не считая, конечно, используя как можно меньше команд синхронизации.

Также есть цифры, чтобы судить о наиболее эффективном методе синхронизации. это рассмотреть 3 потока, используемые в приложении, и два из них должны заполнить для меня запуск четвертых потоков, если я использую 2 cudaStreamSyncs или только один cudaDeviceSync, что будет меньше потерь?

+1

cudaThreadSynchronize устарел. –

ответ

8

Основное отличие между методами синхронизации - «опрос» и «блокировка».

«Опрос» - это механизм, по которому драйвер ожидает GPU - он ожидает, что 32-разрядное место памяти достигнет определенного значения, написанного графическим процессором. Он может вернуть ожидание быстрее после того, как ожидание будет разрешено, но, ожидая, он сжигает ядро ​​процессора, смотрящее на это место памяти.

«Блокировка» может быть запрошена по телефону cudaSetDeviceFlags() с cudaDeviceScheduleBlockingSync или по телефону cudaEventCreate() с cudaEventBlockingSync. Блокирование ожидания приводит к тому, что драйвер вставляет команду в буфер команд DMA, который сигнализирует прерывание, когда все предыдущие команды в буфере выполнены. Затем драйвер может сопоставить прерывание с событием Windows или дескриптором файла Linux, что позволяет командам синхронизации ждать без постоянного сжигания процессора, а также методы опроса по умолчанию.

Запросы в основном ручной проверки того, что 32-разрядная ячейка памяти, используемая для опроса; поэтому в большинстве ситуаций они очень дешевы. Но если ECC включен, запрос будет погружаться в режим ядра, чтобы проверить, есть ли ошибки ECC; и в Windows любые ожидающие команды будут сброшены в драйвер (для чего требуется кусок ядра).

+0

Похоже, что разница между опросом и блокировкой заключается в том, что опрос сжигает процессорное время, а блокировка - нет. Однако нет никакой разницы во времени для синхронизации. В ситуации, когда CPU не работает, они сводятся к одному и тому же. Это верно ? – shadow

+0

Возможны разницы во времени, поскольку обработка прерываний добавляет латентность. Поэтому в обмен на то, что вы не сжигаете CPU при опросе, вы платите в форме более длительного времени между ожиданием, которое будет разрешено, и нить, которая будет разблокирована в результате. – ArchaeaSoftware

+0

Но какая разница между 'cudaDeviceScheduleBlockingSync' и' cudaDeviceScheduleYield'? 'cudaDeviceScheduleYield', как написано:« Попросите CUDA дать свой поток при ожидании результатов с устройства. Это может увеличить задержку при ожидании устройства, но может увеличить производительность потоков ЦП, выполняющих работу параллельно с устройством ». - т. е. результат ожидания ** без ожога CPU во вращении ** - то есть «блокировка». И 'cudaDeviceScheduleBlockingSync' тоже - ждать результата без ожога CPU. Но какая разница? – Alex

Смежные вопросы