WedX - журнал о программировании и компьютерных науках

Оптимизация использования регистров OpenCL и CUDA

Я сейчас пишу ядро ​​OpenCL (но полагаю, что в CUDA будет то же самое), и в настоящее время пытаюсь оптимизировать для NVidia GPU.

В настоящее время я использую 63 регистра в своем ядре, это ядро ​​очень большое, поэтому оно использует все регистры графического процессора. Я ищу способ:

1) Посмотрите, какие переменные находятся в регистрах, а какие - в глобальной памяти (потому что, если у меня недостаточно регистров, компилятор сохраняет переменные в глобальной памяти).

2) Есть ли способ указать, какая переменная важнее (или какая должна быть в регистрах). Потому что я использую некоторые переменные, которые есть, но используются реже. Способ отдать приоритет?

Есть ли другая стратегия оптимизации, когда мы уже используем все регистры?

Кстати: я также пытался читать код PTX и искать все ключевые слова ".reg", но проблема в том, что PTX не читается, я не знаю, какой регистр используется для какой переменной в моем коде. Я не нашел способа получить корреспонденцию!

Благодарность

04.10.2012

Ответы:


1

Посмотрите, какие переменные находятся в регистрах, а какие затем в глобальной памяти

Для этого я не знаю, как это проверить, однако

Есть ли способ указать, какая переменная важнее

Один трюк, который я использую, когда вижу, что у меня пролились регистры (из-за их отсутствия или когда мне нужно использовать динамическое индексирование в локальных варах, что плохо), - это явно хранить те, которые, как мне кажется, не так важны, в локальная память (в CUDA она называется "разделяемой")

например до:

uint16 somedata;

после:

__local uint16 somedata[WG_SIZE]; // or __local uint someadata[16];

но будьте осторожны, если ваше использование локальной памяти будет значительно увеличено, вы рискуете получить штраф, потому что количество фронтов волны в полете будет меньше (т.е. у вас может быть меньшая занятость)

Надеюсь это поможет.

05.01.2013
  • __local uint16 somedata означает, что все потоки в группе будут видеть одну и ту же переменную вместо частной копии, поэтому это приведет к разному поведению. 11.05.2013
  • да, вы правы, я допустил опечатку, на самом деле я должен был написать __local uint16 somedata [WG_SIZE]; Я поправлю. 31.05.2013

  • 2

    (1) Это называется разливом регистров. Я не думаю, что есть способ узнать, какие переменные выпадают, кроме изучения сборки SASS. OpenCL сначала компилируется в PTX, виртуальную машину с бесконечным количеством регистров (без разрыва). Для получения дополнительной информации см. Презентацию NVIDIA Local Memory and Register Spilling.

    (2) Вы можете попробовать использовать ключевое слово volatile при объявлении переменных, которые вы не хотите хранить в регистрах. volatile заставит компилятор выгружать переменную в память вместо того, чтобы переносить ее в регистре между операциями.

    04.10.2012
  • volatile также предотвращает множество оптимизаций, так что это не обязательно победа. 04.10.2012
  • volatile - плохая идея, потому что каждый раз, когда переменная используется, будет читаться. И из глобальной памяти это будет медленно. 05.10.2012

  • 3

    Не видя кода, можно попытаться «принудительно» использовать регистры, используя локальные копии в ограниченном объеме. Возможно, только некоторые из ваших переменных доступны в данной части вашего кода. Затем вы можете объявить новые переменные в области видимости и интенсивно их использовать. Нет никаких гарантий, но я знаю, что иногда это помогает.

    int a, b, d;
    double x,y;
    
    ...
    
    {
         int ra = a;     // copy into new variables more likely to be kept in registers
         double rx = x;
    
         ... use rx and ra ...
    
         a = ra;
         b = rx;       // copy back.
    }
    
    ...
    
    05.10.2012
  • Большое спасибо за все ваши ответы, я также пытался прочитать код PTX и найти все ключевые слова .reg, но проблема в том, что PTX не читается, я не знаю, какой регистр используется для какой переменной в моем коде . Я не нашел способа получить корреспонденцию! 18.10.2012
  • Кажется, что лучший способ оптимизировать использование регистров - это использовать {...} для определения области видимости. Я удивлен, что компилятор не может этого сделать без посторонней помощи! 19.10.2012
  • Что-то еще ... В CUDA мы можем использовать метод cudaDeviceSetCacheConfig для увеличения размера кеша L1. Кто-нибудь знает, есть ли способ вызвать его из программного обеспечения OpenCL, даже если он не совсем стандартный! 19.10.2012
  • Еще вопросы по теме: 1) Мои структуры также хранятся в регистре или в глобальной памяти, L1 и т. Д.? 2) Если мои значения помещены в кеш L1, то он тоже может пострадать от конфликтов банков памяти? Спасибо 19.10.2012
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]