Размер разделяемой памяти GPU очень мал - что я могу с этим поделать? - PullRequest
18 голосов
/ 13 февраля 2011

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

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

Ответы [ 3 ]

26 голосов
/ 13 февраля 2011

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

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

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

9 голосов
/ 27 апреля 2012

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

4 голосов
/ 13 апреля 2014

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

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

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

cudaFuncSetCacheConfig(matrix_multiplication, cudaFuncCachePreferShared);
matrix_multiplication<<<bla, bla>>>(bla, bla, bla); 
...