Intel imechapisha ISPC 1.31 (Implicit SPMD Program Compiler), iliyoundwa kukusanya msimbo wa C na viendelezi vya programu sambamba vya SPMD (Single Program, Multiple Data), ambavyo huwezesha utekelezaji sambamba wa matukio mengi ya programu moja yenye seti tofauti za data ya ingizo. Msimbo wa mradi umeandikwa katika C++ na unasambazwa chini ya leseni ya BSD. Inasaidia Linux, Windows, macOS na FreeBSD.
Programu za C zilizo na viendelezi vya SPMD hukusanywa kwa ajili ya kutekelezwa kwenye vitengo vya ukokotoaji vya SIMD vinavyotolewa na CPU na GPU, ambayo hukuruhusu kutumia mbinu za uwekaji vekta za SIMD bila uboreshaji wa kiwango cha chini na matumizi dhahiri ya maagizo ya SIMD kwenye msimbo. Ili kuandika vitendaji vinavyoweza kusawazishwa, sintaksia na nahau zinazojulikana za lugha C hutumiwa - vitendaji vya SPMD vinaingiliana moja kwa moja na vitendaji na miundo iliyoandikwa katika C/C++. Vitatuzi vilivyopo vinaweza kutumika kutatua programu.
ISPC hutumia miundombinu ya LLVM kama sehemu ya nyuma ya utengenezaji wa msimbo na uboreshaji. x86 (SSE2, SSE4, AVX, AVX2, AVX512) na ARM (NEON) maagizo ya vekta yanaauniwa, pamoja na upakiaji mahesabu kwa upande wa GPU (Intel Gen9 na Xe). Kwenye usanifu na vizuizi vya vekta ya SSE kusindika vitu 4 kwa wakati mmoja, utumiaji wa ISPC hufanya iwezekanavyo kufikia kasi ya utekelezaji wa programu kwa mara 3 au zaidi, na kwenye usanifu na AVX vekta huzuia kusindika vitu 8 kwa wakati mmoja, kuongeza kasi kunaweza kufikia 5- mara 6. Kwa kuongezea, pamoja na saizi ya kizuizi cha vekta, kuongeza kiwango pia kunahakikishwa kwa utekelezaji wa cores tofauti za processor.
Ubunifu muhimu ulioongezwa katika toleo la ISPC 1.31:
- ΠΠΎΠ±Π°Π²Π»Π΅Π½Π° ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»ΡΠ½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 64-ΡΠ°Π·ΡΡΠ΄Π½ΠΎΠΉ little-endian Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ PowerPC (ppc64le). ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ±ΠΎΡΠΊΠ° Π΄Π»Ρ POWER ISA 2.7 (POWER8+) Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡΠΌΠΈ VSX (Vector Scalar Extension).
- ΠΠΎΠ±Π°Π²Π»Π΅Π½Ρ Π½ΠΎΠ²ΡΠ΅ ΡΠ±ΠΎΡΠΎΡΠ½ΡΠ΅ ΡΠ΅Π»ΠΈ avx10.2nvl-x4, avx10.2nvl-x8, avx10.2nvl-x16, avx10.2nvl-x32 ΠΈ avx10.2nvl-x64, ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΠΈΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΡΠ°ΡΡΠΈΡΠ΅Π½Π½ΡΠΉ Π½Π°Π±ΠΎΡΠΎΠ² ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ AVX10.2 (Advanced Vector Extensions) ΠΈ APX (Advanced Performance Extensions) Π΄Π»Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠΎΠ² Π½Π° Π±Π°Π·Π΅ ΠΌΠΈΠΊΡΠΎΠ°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ Intel Nova Lake.
- Π Π΄ΠΈΡΠΏΠ΅ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΎΡΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ Π²ΡΠ±ΠΎΡ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² ΡΠ±ΠΎΡΠΎΡΠ½ΡΡ ΡΠ΅Π»Π΅ΠΉ Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ AMX (avx512spr, avx512gnr, avx10.2dmr) ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ ΡΠ΅Π°Π»ΡΠ½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠΉ AMX (Advanced Matrix Extensions) Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΈ CPU.
- ΠΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΎΠΏΡΠΈΡ Β«βopt=disable-apxΒ» Π΄Π»Ρ Π²ΡΠ±ΠΎΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ x86 APX (egpr, ndd, push2pop2, ppx, ccmp, cf, nf, zu ΠΈ jmpabs), ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π²ΠΊΠ»ΡΡΠ΅Π½Ρ Π² ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠΈΡ APX ΡΠ±ΠΎΡΠΎΡΠ½ΡΡ ΡΠ΅Π»ΡΡ , ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ avx10.2dmr ΠΈ avx10.2nvl.
- ΠΠΎΠ±Π°Π²Π»Π΅Π½Ρ ΡΠ±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ (Β«balancedΒ») ΠΈ Π°Π³ΡΠ΅ΡΡΠΈΠ²Π½ΡΠΉ (Β«aggressiveΒ») ΡΠ΅ΠΆΠΈΠΌΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ, Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌΡΠ΅ ΡΠ΅ΡΠ΅Π· ΠΎΠΏΡΠΈΡ Β«βopt=fast-mathΒ» ΠΈ Π±ΠΎΠ»Π΅Π΅ Π°Π³ΡΠ΅ΡΡΠΈΠ²Π½ΡΠ΅ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΡΠΌ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΠ΅ΠΆΠΈΠΌΠΎΠΌ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ.
- Π ΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ Π½ΠΎΠ²ΡΠ΅ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ:
erf, erfc (ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ ΠΠ°ΡΡΡΠ°), expm1 (ΡΠΎΡΠ½ΠΎΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ Β«exp(x)-1Β»), log1p (Β«log(1+x)Β»), sinh, cosh ΠΈ tanh (Π³ΠΈΠΏΠ΅ΡΠ±ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠΈΠ½ΡΡ, ΠΊΠΎΡΠΈΠ½ΡΡ ΠΈ ΡΠ°Π½Π³Π΅Π½Ρ). ΠΠΎΠ²ΡΡΠ΅Π½Π° ΡΠΎΡΠ½ΠΎΡΡΡ ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ asin, acos, atan ΠΈ log. - ΠΠ½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΠ²ΡΡΠ΅Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ 32-Π±ΠΈΡΠ½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ (shuffles) Π΄Π»Ρ ΡΠ±ΠΎΡΠΎΡΠ½ΠΎΠΉ ΡΠ΅Π»ΠΈ avx2-i32x16 ΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ popcnt Π΄Π»Ρ ΡΠ΅Π»Π΅ΠΉ avx2-i8x32, avx512skx-x32 ΠΈ avx512skx-x64.
- ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ LLVM ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ½ Π΄ΠΎ Π½Π°Ρ ΠΎΠ΄ΡΡΠ΅ΠΉΡΡ Π² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ Π²Π΅ΡΠΊΠΈ 23.
Chanzo: opennet.ru
