Можно ли статически распределять разные общие памяти для разных блоков?

0

Использовать блок 0

__shared__ int a[VERY_LARGE];
__shared__ char b[VERY_LARGE];

блок 1 будет использовать

__shared__ double c[VERY_LARGE];
__shared__ int d[VERY_LARGE];

Скажем, a и b будут занимать все 48 Кбайт разделяемой памяти в одном SM.

c и d будут занимать все 48 Кбайт разделяемой памяти в одном SM.

Можно ли выделить a и b в одном SM, c и d в другом SM?

  • 2
    Присвоение потоковых потоков потоковым мультипроцессорам является задачей планировщика, а не программиста. Таким образом, у вас не будет гарантии, что планировщик примет решение запустить блоки 0 и 1 на разных потоковых мультипроцессорах. Также предупреждаем, что для получения максимальной производительности от графического процессора, грубо говоря, все потоки должны выполнять одну и ту же инструкцию «одновременно». Чтобы добиться того, что вы говорите в своем посте, вы должны иметь условное распределение общей памяти, что заставляет меня думать, что у вас в конечном итоге будут другие условные операторы. Это может повлиять на производительность.
  • 0
    @JackOLantern: Это был бы идеальный ответ на вопрос, краткий ответ которого - «НЕТ». Не могли бы вы добавить это? Я уверен, что это проголосовало, чтобы убрать это из оставшегося без ответа списка.
Теги:
cuda
gpu

1 ответ

1
Лучший ответ

Короткий ответ: НЕТ.

Назначение блоков потоков потоковым мультипроцессорам - это задание планировщика, а не программиста. Поэтому у вас не будет никакой гарантии, что планировщик решит запустить блоки 0 и 1 на разных потоковых мультипроцессорах. Этот поток

Как CUDA Blocks/Warps/Threads отображаются на CUDA-ядра?

будет полезно вам понять. Также в документе

Архитектура вычислений CUDA следующего поколения NVIDIA: Fermi

хотя и относится к Ферми, даст вам более глубокое понимание.

Также следует предупредить, что для получения наилучшей производительности из графического процессора, грубо говоря, все потоки должны выполнять одну и ту же инструкцию "одновременно". Чтобы достичь того, что вы говорите в своем посте, вы должны иметь условное разделяемое распределение памяти, из-за чего я думаю, что вы получите другие условные утверждения. Это может повлиять на производительность.

  • 0
    Я понимаю, что это работа планировщика, а не программиста. Но программист мог бы выделить всю разделяемую память 48 КБ, чтобы убедиться, что только один блок выполняется на одном SM, верно?
  • 1
    @yidiyidawu: Да, если вы запустите ядро, использующее 48 КБ общей памяти, оно сможет запустить только один блок на SM. Но, как вы думаете, почему важно это делать? Аппаратное обеспечение обеспечивает ограничения на выравнивание, которые эффективно снимают блоки между собой, так что, если ваши потоки подчиняются хорошо документированным правилам, касающимся доступа к общей памяти, они будут работать одновременно (с хорошо задокументированной гранулярностью деформации) без проблем ...
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню