6.5.17 Прагмы для отдельных циклов
-
#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-15.3.0/gcc/Loop_002dSpecific-Pragmas.html