Использовать блок 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?
Короткий ответ: НЕТ.
Назначение блоков потоков потоковым мультипроцессорам - это задание планировщика, а не программиста. Поэтому у вас не будет никакой гарантии, что планировщик решит запустить блоки 0
и 1
на разных потоковых мультипроцессорах. Этот поток
Как CUDA Blocks/Warps/Threads отображаются на CUDA-ядра?
будет полезно вам понять. Также в документе
Архитектура вычислений CUDA следующего поколения NVIDIA: Fermi
хотя и относится к Ферми, даст вам более глубокое понимание.
Также следует предупредить, что для получения наилучшей производительности из графического процессора, грубо говоря, все потоки должны выполнять одну и ту же инструкцию "одновременно". Чтобы достичь того, что вы говорите в своем посте, вы должны иметь условное разделяемое распределение памяти, из-за чего я думаю, что вы получите другие условные утверждения. Это может повлиять на производительность.
0
и1
на разных потоковых мультипроцессорах. Также предупреждаем, что для получения максимальной производительности от графического процессора, грубо говоря, все потоки должны выполнять одну и ту же инструкцию «одновременно». Чтобы добиться того, что вы говорите в своем посте, вы должны иметь условное распределение общей памяти, что заставляет меня думать, что у вас в конечном итоге будут другие условные операторы. Это может повлиять на производительность.