SIN / COS / LN... очень медленно на CLANG по сравнению с MSVC/ICL

Сейчас я снова сравниваю компиляторы. Моя цель в основном довольно простые циклы 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.

0 ответов

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