Подтвердить что ты не робот

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

Размер общей памяти ( "локальная память" в терминах OpenCL) составляет всего 16 KiB на большинстве графических процессоров nVIDIA.

У меня есть приложение, в котором мне нужно создать массив с 10 000 целыми числами. поэтому объем памяти мне понадобится, чтобы соответствовать 10 000 целых чисел = 10 000 * 4b = 40kb.

  • Как я могу обойти это?
  • Есть ли какой-либо GPU, который имеет более 16 KiB общей памяти?
4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

Если вы предпочитаете L1 для Shared, тогда 48KB перейдет на L1, а 16KB перейдет к Shared. Если вы предпочитаете Shared для L1, тогда 48KB пойдет в Shared, а 16KB перейдет на L1.

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

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