Отключить автоматическую векторизацию определенных циклов в функции в GCC
Я хочу отключить автоматическую векторизацию для определенных циклов в функции. Как я могу сделать это с GCC? Я знаю, что могу отключить автоматическую векторизацию для всей функции с __attribute__((optimize("no-tree-vectorize")))
но как мне сделать это для отдельных циклов в функции (с MSVC я могу использовать добавить #pragma loop(no_vector)
).
void dot_int(int * __restrict a, int * __restrict b, int * __restrict c) {
for(int i=0; i<1024; i++) {
c[i] = a[i] + b[i];
}
//#pragma loop(no_vector) //don't vectorize this loop
for(int i=0; i<1024; i++) {
c[i] = a[i] + b[i];
}
}
1 ответ
На случай, если кому-то все равно, я нашел решение. Это действительно обратное. Вместо того, чтобы отключать автоматическую векторизацию для определенных циклов, он включает ее только для определенных циклов.
Для этого скомпилируйте с -O2
и использовать #pragma omp simd
как это.
void dot_int(int * __restrict a, int * __restrict b, int * __restrict c) {
#pragma omp simd
for(int i=0; i<1024; i++) {
c[i] = a[i] + b[i];
}
for(int i=0; i<1024; i++) {
c[i] = a[i] + b[i];
}
}
Мысль векторизация #pragma omp simd
не обязательно генерировать тот же код, что и векторизация -O3
,