У меня есть вопрос о том, как графические процессоры выполняют синхронизацию. Как я знаю, когда варп сталкивается с барьером (при условии, что он находится в OpenCL), и он знает, что другие перекосы той же группы еще не были там. Поэтому он должен ждать. Но что именно делает этот варп в течение времени ожидания? Является ли он все еще активным декомпрессивом? Или он сделает какие-то нулевые операции?Синхронизация в графических процессорах
Как я заметил, когда у нас есть синхронизация в ядре, количество инструкций увеличивается. Интересно, что является источником этого приращения. Является ли синхронизация разбитой на несколько меньших инструкций GPU? Или потому, что незанятые перекосы выполняют некоторые дополнительные инструкции?
И, наконец, я сильно удивляюсь, зависит ли стоимость, добавленная синхронизацией, по сравнению с одной без синхронизации (скажем, барьер (CLK_LOCAL_MEM_FENCE)), количество варпов в рабочей группе (или в потоковом блоке)?
Спасибо за подробный ответ. Было бы неплохо, если бы вы могли поделиться некоторыми документами, из которых вы получили знания. Я хотел бы привести в своих исследованиях. Не могли бы вы объяснить, почему ядра, связанные с памятью, вызывают задержки памяти? Как я понимаю, запрос памяти рядом с синхронизацией (появляется перед синхронизацией), которая должна быть скрыта при некоторых вычислениях, будет остановлена до тех пор, пока данные не поступят. Правильно ли это? С другой стороны, если ядро не является mem-bound, что делает синхронизация? латентность конвейера? (не предполагалось никаких расхождений, и да, что все это делает с расхождениями?) – Zk1001