Размер разделяемой памяти 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);