Управление расхождением потока в SIMT и SIMD

Я читаю эту книгу, чтобы изучить концепции CUDA. глубоко. В одной из глав, которая знакомит с концепцией SIMT, говорится

Возможность расхождения потока управления в SIMT также упрощает требование к программистам использовать дополнительные инструкции для обработки потока управления по сравнению с SSE.

Я знаю, что это утверждение сделано на основе того факта, что SSE работает с техникой реализации SIMD, а потоки CUDA работают по принципу SIMT, но может ли кто-нибудь уточнить/объяснить это предложение, используя какой-нибудь пример. Заранее спасибо.


person Recker    schedule 31.12.2012    source источник


Ответы (1)


С SIMD, если у вас есть подпрограмма, в которой некоторые элементы должны обрабатываться иначе, чем другие элементы, вам нужно явно позаботиться об операциях маскирования, чтобы они применялись только к правильным элементам. С SIMT-архитектурой CUDA вы получаете иллюзию потока управления в каждом потоке, поэтому вам не нужно явное маскирование операций — это все еще происходит «под капотом», конечно, но бремя снимается с программист.

Пример: предположим, вы хотите установить все отрицательные элементы равными нулю. В КУДА:

if (X[tid] < 0)
    X[tid] = 0;    // NB: CUDA core steps through this instruction but only executes
                   //     it if the preceding condition was true

В SIMD (SSE):

__m128 mask = _mm_cmpge_ps(X, _mm_set1_ps(0));  // generate mask for all elements >= 0
X = _mm_and_ps(X, mask);                        // clear all elements which are < 0
person Paul R    schedule 31.12.2012
comment
Возможно, вы захотите сравнить код CUDA с кодом OpenMP 4 #pragma omp simd, и в этом случае компилятор создаст маскировку за кулисами. - person Jeff Hammond; 17.04.2018