Spec-Zone.ru › GCC 11

Предыдущий: Функционально-специфические прагмы опций, Вверх: Прагмы, принимаемые GCC [Оглавление][Индекс]

6.62.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 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-11.4.0/gcc/Loop-Specific-Pragmas.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API