Размер общей памяти GPU очень мал - что я могу сделать с этим?
Размер общей памяти ( "локальная память" в терминах OpenCL) составляет всего 16 KiB на большинстве графических процессоров nVIDIA.
У меня есть приложение, в котором мне нужно создать массив с 10 000 целыми числами. поэтому объем памяти мне понадобится, чтобы соответствовать 10 000 целых чисел = 10 000 * 4b = 40kb.
- Как я могу обойти это?
- Есть ли какой-либо GPU, который имеет более 16 KiB общей памяти?
Ответы
Ответ 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);