Отключить автоматическую векторизацию определенных циклов в функции в 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,

Другие вопросы по тегам