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