SIN / COS / LN ... очень медленно на CLANG по сравнению с MSVC / ICL - PullRequest
0 голосов
/ 26 сентября 2018

Я сейчас снова сравниваю компиляторы.Моя цель - в основном довольно простые циклы DSP с оптимизацией AVX2 / AVX512, такие как:

for (int i=0; i<cnt; i++) x[i] = sin(y[i]) * z[i];

Я обнаружил, что CLANG часто намного превосходит MSVC 2017 и компилятор Intel 2019, особенно когда используются встроенные функции AVX.Однако всякий раз, когда существуют магические математические функции, такие как sin, cos, sqrt, ln, exp ... CLANG дает огромные сбои, обеспечивая примерно в 4-10 раз более медленный код.Кажется, что и ICL, и MSVC каким-то образом используют инструкции SSE / AVX, но CLANG, вероятно, нет.Есть проблема с моей установкой или каким-то другим способом ее решить?

=============================

Минимальный пример:

#include <math.h>
#include <stdio.h>
#include <Windows.h>

__declspec(noinline) void FN(float* x, int cnt)
{
    for (int i=0; i<cnt; i++) x[i] = sinf(x[i]);
};

int main(int argc, char* argv[])
{
    DWORD start = ::GetTickCount();

    __declspec(align(64)) float x[256];
    for (int i=0; i<256; i++) x[i] = (float)i;
    for (int iter=0; iter<20000000; iter++) FN(x, 256);

    DWORD end = ::GetTickCount();
    printf("%i\n", end - start);
    float sum = 0;
    for (int i=0; i<256; i++) sum += x[i];
    printf("%f\n", sum);
    return 1;
};

Я использовал флаги CLANG (LLVM 7.0.0):

-fno-rtti -arch x86_64 "-D MARCHITECTURE_AVX512" -mavx512f -fasm-blocks -stdlib=libstdc++ -mfpmath=sse -ffast-math -march=native -fno-math-errno -O3 -fdata-sections -ffunction-sections

CLANG генерирует какой-то сумасшедший код, полный вызовов различных функцийв некоторых случаях это даже казалось смешиванием наборов команд SSE2 и AVX.MSVC создает цикл вызовов для sinf8, который содержит хороший простой код AVX2, рассчитывающий 8 синусов одновременно.Здесь требуется около 5 секунд для кода MSVC и 12 секунд для CLANG.

...