Написать несколько ядер или одно ядро - PullRequest
5 голосов
/ 29 февраля 2012

Предположим, у меня есть две большие функции.Лучше написать их в отдельных ядрах и вызывать их последовательно, или лучше написать только одно ядро?(Я не хочу читать данные обратно и форсировать форму между хостом и устройством между ними).Как насчет ускорения, если я хочу вызывать ядро ​​много раз?

Ответы [ 3 ]

11 голосов
/ 01 марта 2012

Следует учитывать влияние регистра на нагрузку на оборудование и производительность.

Как правило, большие ядра имеют большие регистры. Типичные устройства OpenCL (т. Е. Графические процессоры) имеют очень ограниченные размеры файлов регистров, и большие ядра могут привести к снижению параллелизма (меньшему количеству одновременных перекосов / волновых фронтов), меньшим возможностям скрытия задержек и снижению общей производительности. С другой стороны, затраты на запуск ядра на большинстве платформ довольно низкие, поэтому, если у вашего алгоритма нет огромного количества состояний для сохранения между «фазами» выполнения, штраф за использование нескольких ядер может быть довольно низким.

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

Конечное руководство должно быть измерено производительность. Для такого рода вещей не существует универсального эмпирического правила. Бенчмаркинг - это единственный способ узнать наверняка.

3 голосов
/ 01 марта 2012

Правильный способ кодирования в OpenCL - разделить ваш код на параллельные задачи, и каждая из них является ядром.Это означает, что каждый цикл for должен быть ядром.Иногда одна функция кода ЦП может привести к реализации с четырьмя ядрами в OCL.

Если вам нужно хранить данные между выполнениями ядра, просто используйте буферы OpenCL и не копируйте на хост (это устраняет узкое место DEVICE <-> HOST).

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

3 голосов
/ 01 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...