6.62.17 Управляющие директивы для циклов
#pragma GCC ivdep-
С помощью этой директивы программист утверждает, что нет зависимостей между итерациями цикла, которые препятствовали бы параллельному выполнению последовательных итераций данного цикла с помощью инструкций SIMD (single instruction multiple data).
Например, компилятор может безусловно векторизовать следующий цикл с помощью директивы:
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 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-12.2.0/gcc/Loop-Specific-Pragmas.html