Размер разделяемой памяти GPU очень мал - что я могу с этим поделать?

Размер разделяемой памяти ("локальная память" в терминах OpenCL) составляет всего 16 КиБ на большинстве современных графических процессоров nVIDIA.
У меня есть приложение, в котором мне нужно создать массив, который имеет 10000 целых чисел. поэтому объем памяти, который мне понадобится, должен соответствовать 10 000 целых чисел = 10 000 * 4b = 40 КБ.

  • Как я могу обойти это?
  • Есть ли графический процессор с общей памятью более 16 КБ?

3 ответа

Думайте об общей памяти как о явно управляемом кеше. Вам нужно будет хранить ваш массив в глобальной памяти и кэшировать его части в разделяемой памяти по мере необходимости, делая несколько проходов или какую-то другую схему, которая минимизирует количество загрузок и сохраняет в / из глобальной памяти.

То, как вы реализуете это, будет зависеть от вашего алгоритма - если вы можете дать некоторые подробности того, что именно вы пытаетесь реализовать, вы можете получить более конкретные предложения.

И последнее замечание: имейте в виду, что разделяемая память распределяется между всеми потоками в блоке - у вас есть менее 16 КБ на поток, если у вас нет единой структуры данных, которая является общей для всех потоков в блоке.

Все вычислительные устройства версии 2.0 и выше (большинство за последний год или два) имеют 48 КБ доступной общей памяти на каждый многопроцессорный процессор. Начнем с того, что Пол сказал правильный ответ: скорее всего, вы не захотите загружать все 10К целых чисел в один мультипроцессор.

Вы можете попробовать использовать cudaFuncSetCacheConfig(nameOfKernel, cudaFuncCachePrefer{Shared, L1}) функция.

Если вы предпочитаете L1 Shared, то 48 КБ перейдут к L1, а 16 КБ перейдут к Shared. Если вы предпочитаете Shared L1, то 48 КБ перейдут к Shared, а 16 КБ перейдут к L1.

Использование:

cudaFuncSetCacheConfig(matrix_multiplication, cudaFuncCachePreferShared);
matrix_multiplication<<<bla, bla>>>(bla, bla, bla); 
Другие вопросы по тегам