Comments 6
А отличия в картинке - смотрите сами, сможете их разглядеть?
Отличия и вправду минимальные. Особенно если учесть, что это изображение показывающее разность между картинками сдлано ярче в 2,5 раза. (Для визуального определения мест, где отличия есть).
Попытался собрать над тем, что было под рукой. Под рукой был телефон. Собирал в termux.
:~/Src/CardRaytracerSIMD$ gcc -o trace ./CardMain.cpp
./CardMain.cpp:25:10: fatal error: 'conio.h' file not found
#include <conio.h>
^~~~~~~~~
1 error generated.
:~/Src/CardRaytracerSIMD$ vim ./CardMain.cpp
:~/Src/CardRaytracerSIMD$ gcc -o trace ./CardMain.cpp
In file included from ./CardMain.cpp:28:
/data/data/com.termux/files/usr/lib/clang/14.0.6/include/immintrin.h:14:2: error: "This header is only meant to be used on x86 and x64 architecture"
#error "This header is only meant to be used on x86 and x64 architecture"
^
сначала ругнулся на conio.h. странно что этот инклуд в коде есть. Говорит что трейсер под linux даже не собирался. В linux этого хедера нет.
Ну а дальше выругалось на то, что у меня не x86/x64.
GCC в termux, если что, это clang
:~/Src/CardRaytracerSIMD$ file `which gcc`
/data/data/com.termux/files/usr/bin/gcc: symbolic link to clang-14
:~/Src/CardRaytracerSIMD$ gcc --version
clang version 14.0.6
Target: aarch64-unknown-linux-android24
Thread model: posix
InstalledDir: /data/data/com.termux/files/usr/bin
Изначально собиралось под Линукс, в исходном архиве есть бенчмарки, но похоже я по незнанию попортил кроссплатформеность.
Сейчас заменил getch на getchar, immintrin.h перенёс внутрь vExt_proc.
Для экзотических платформ нужно задать vExt_proc 0 и tracerProc tracer3, чтобы собрать автовекторизованную версию вместо векторных расширений, которые местами используют интринсики.
Когда твой проект выкапывают даже из вебархива =)
Насколько помню, компиляторы тех времен, не справлялись с автовекторизацией. И даже были казусы, когда мелкие изменения приводили к кратному замедлению.
У меня основной код был написан давно, в 2017-2018. Всё никак не мог статью дописать, хотелось именно статью, а не просто выложить на форуме. Дотянул до того, что форума уж нет...
И я помню, что например Clang 5 справлялся с векторизацией. А, ну есть же godbolt, можно точно сказать:
https://gcc.godbolt.org/z/ra5MTnfzb
Clang 3.3 и gcc 5.1 нужны для векторизации, 2013-2015 годы.
Но действительно, неустойчиво оно тогда работало, вот этот вариант - уже Clang 3.9 и gcc 4.7
https://gcc.godbolt.org/z/s3bPEzsrr
В том и смысл статьи, показать, что современные компиляторы менее капризны и при грамотном тюнинге кода многое делают сами.
Приёмы высокоуровневой векторизации на примере Card Raytracer