2013-02-26 4 views
1

CUDA C Руководство по программированию предоставляет следующие операторы:Понимание CUDA проверка зависимостей

Для устройств, которые поддерживают одновременное выполнение ядра и имеют вычислительные возможности 3,0 или ниже, любая операция, которая требует проверять зависимости, чтобы увидеть, если потоковое ядро ​​ завершено:

‣ Может запускаться только тогда, когда все поточные блоки всех предыдущих запусков ядра из любого потока в контексте CUDA начали выполнение;

‣ Блокирует все последующие запуска ядра из любого потока в контексте CUDA до завершения проверки ядра .

Я совершенно потерян здесь. Что такое проверка зависимостей? Могу ли я сказать, что выполнение ядра на некоторых устройствах требует проверки зависимостей во всех предыдущих передачах ядра или памяти с использованием той же памяти устройства? Если это верно (может быть, неверно), эта проверка зависимостей блокирует все последующие ядра из любого другого потока в соответствии с вышеприведенным утверждением, и поэтому после этого не произойдет асинхронного или параллельного выполнения, что кажется неверным.

Любое объяснение или разработка будут оценены!

ответ

4

Прежде всего, предлагаю вам посетить webinar-site из nvidia и посмотреть веб-семинар по параллелизму & Потоки.

Далее рассмотрим следующие моменты:

  • команды, выдаваемые к тому же самому потоку, рассматриваются как зависимой

    например, вы вставляете ядро ​​в поток после memcopy некоторых данных это Ядро будет acess. Ядро «зависит» от от доступных данных.

  • команды в том же потоке, таким образом, гарантированно будет выполнен последовательно (или синхронно, который часто используется в качестве синонима)
  • команды в различных потоках, однако независимы и могут работать одновременно
  • так зависимости известны только программисту и выражаются с использованием потоков (чтобы избежать ошибок)!

Следующее соответствует только устройствам с вычислительной способностью 3,0 или ниже (как указано в quide). Если вы хотите узнать больше об изменениях в режиме планирования потока с возможностью вычисления 3.5, посмотрите на HyperQ и соответствующие example.В этот момент я также хочу обратиться к теме this, где я нашел примеры HyperQ :)

О вашем втором вопросе: я не совсем понимаю, что вы подразумеваете под «выполнением ядра в некоторой памяти устройства» или «выполнением ядра» с использованием памяти устройства ", поэтому я сократил ваше заявление до:

Выполнение ядра требует проверки зависимости всех предыдущих ядер и передачи памяти.

Лучше бы:

операция Л CUDA требует проверять зависимости, чтобы увидеть погоду операций предшествующего CUDA в том же потоке завершена.

Я думаю, что ваша проблема здесь с выражением «начал выполняться». Это означает, что все еще могут быть независимые (то есть в разных потоках) запуска ядра, которые будут параллельными с предыдущими ядрами при условии, что все они начали выполнять и.

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