6.60.14 Loop-Specific Pragmas
#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;
}
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-5.5.0/gcc/Loop-Specific-Pragmas.html