Conj () и векторизация - PullRequest
0 голосов
/ 03 мая 2019

Я векторизовал программу, которая содержит следующие строки кода:

    #pragma omp parallel for simd aligned(g_0:sizeof(complex double))
    for(int i=0;i<vectorSize;i++)
    {
        g_0[i]=conj(g_0[i]);    //block SIMD FAIL
    }

Я запускаю компилятор GCC с -fopt-info-vec-optimized, проверяю вывод и обнаруживаю, что этот раздел кода не векторизован. Однако, если я напишу тот же код, что и следующий

    #pragma omp parallel for simd aligned(g_0:sizeof(complex double))
    for(int i=0;i<vectorSize;i++)
    {
        g_0[i]=creal( g_0[i]) -cimag( g_0[i]);  //block SIMD PASS
    }

Тогда код будет векторизован. Что я не понимаю, так это то, что оба этих кода выполняют один и тот же результат, используя функции из одной и той же библиотеки заголовков, так почему один векторизован, а другой нет? У меня такое ощущение, что это связано с самими функциями, однако я бы ожидал, что второй код также не будет векторизован, поскольку creal () и cimag () также являются функциями.

...