6.64.16 Прагмы, специфичные для циклов
-
#pragma GCC ivdep -
С помощью этой прагмы программист утверждает, что нет зависимостей, связанных с циклом, которые могли бы помешать последовательным итерациям следующего цикла выполнять параллельно с инструкциями SIMD (одна инструкция — множество данных).
Например, компилятор может безусловно выполнить векторизацию следующего цикла с помощью прагмы:
void foo (int n, int *a, int *b, int *c) { int i, j; #pragma GCC ivdep for (i = 0; i < n; ++i) a[i] = b[i] + c[i]; }В этом примере использование квалификатора
restrictимело бы тот же эффект. В следующем примере это было бы невозможно. Предположим k < -m или k >= m. Только с помощью прагмы компилятор знает, что он может безусловно выполнить векторизацию следующего цикла:void ignore_vec_dep (int *a, int k, int c, int m) { #pragma GCC ivdep for (int i = 0; i < m; i++) a[i] = a[i + k] * c; } -
#pragma GCC novector -
С помощью этой прагмы программист утверждает, что следующий цикл должен быть предотвращен от выполнения параллельно с инструкциями SIMD (одна инструкция — множество данных).
Например, компилятор не может выполнить векторизацию следующего цикла с помощью прагмы:
void foo (int n, int *a, int *b, int *c) { int i, j; #pragma GCC novector for (i = 0; i < n; ++i) a[i] = b[i] + c[i]; } -
#pragma GCC unroll n -
Вы можете использовать эту прагму для управления тем, сколько раз должен быть развернут цикл. Она должна быть размещена непосредственно перед циклом
for,whileилиdoили#pragma GCC ivdep, и применяется только к следующему циклу. n — это целочисленное константное выражение, задающее коэффициент развёртывания. Значения 0 и 1 блокируют любое развёртывание цикла.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-14.2.0/gcc/Loop_002dSpecific-Pragmas.html