ΠΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π° Π½ΠΎΠ²Π°Ρ ΡΠ΅Π΄Π°ΠΊΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠ° Vortex, ΡΠ°Π·Π²ΠΈΠ²Π°ΡΡΠ΅Π³ΠΎ ΠΎΡΠΊΡΡΡΡΠΉ GPGPU Π½Π° Π±Π°Π·Π΅ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ Π½Π°Π±ΠΎΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄ RISC-V, ΡΠ°ΡΡΡΠΈΡΠ°Π½Π½ΡΠΉ Π½Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ API OpenCL ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ SIMT (Single Instruction, Multiple Threads). ΠΡΠΎΠ΅ΠΊΡ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ ΠΏΡΠΈ ΠΏΡΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΈ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠΉ Π² ΠΎΠ±Π»Π°ΡΡΠΈ 3D-Π³ΡΠ°ΡΠΈΠΊΠΈ ΠΈ ΠΏΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ Π½ΠΎΠ²ΡΡ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡ GPU. Π‘Ρ Π΅ΠΌΡ, ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΡΡ Π±Π»ΠΎΠΊΠΎΠ² Π½Π° ΡΠ·ΡΠΊΠ΅ Verilog, ΡΠΈΠΌΡΠ»ΡΡΠΎΡ, Π΄ΡΠ°ΠΉΠ²Π΅ΡΡ ΠΈ ΡΠΎΠΏΡΡΡΡΠ²ΡΡΡΠ°Ρ ΠΏΡΠΎΠ΅ΠΊΡΠ½Π°Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΡΡΡΡ ΠΏΠΎΠ΄ Π»ΠΈΡΠ΅Π½Π·ΠΈΠ΅ΠΉ Apache 2.0.
ΠΡΠ½ΠΎΠ²Ρ GPGPU ΡΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΈΠΏΠΎΠ²ΠΎΠΉ ISA RISC-V, ΡΠ°ΡΡΠΈΡΠ΅Π½Π½ΡΠΉ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΌΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡΠΌΠΈ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠΌΠΈ Π΄Π»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ GPU ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ. ΠΡΠΈ ΡΡΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ΅ Π½Π°Π±ΠΎΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄ RISC-V ΡΠ²Π΅Π΄Π΅Π½Ρ ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌΡ ΠΈ ΠΏΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠΆΠ΅ ΠΈΠΌΠ΅ΡΡΠΈΠ΅ΡΡ Π²Π΅ΠΊΡΠΎΡΠ½ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ. ΠΠΎΡ ΠΎΠΆΠΈΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π² ΠΏΡΠΎΠ΅ΠΊΡΠ΅ RV64X, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°ΠΊΠΆΠ΅ ΡΠ°Π·Π²ΠΈΠ²Π°Π΅Ρ ΠΎΡΠΊΡΡΡΡΠΉ GPU Π½Π° Π±Π°Π·Π΅ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ RISC-V.
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ Vortex:
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 32- ΠΈ 64-ΡΠ°Π·ΡΡΠ΄Π½ΡΡ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡ Π½Π°Π±ΠΎΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄ RISC-V RV32IMF ΠΈ RV64IMAFD.
- ΠΠ°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΠΎΠ΅ ΡΠΈΡΠ»ΠΎ ΡΠ΄Π΅Ρ, Π±Π»ΠΎΠΊΠΎΠ² Π·Π°Π΄Π°Ρ (warps) ΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ².
- ΠΠ°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΠΎΠ΅ ΡΠΈΡΠ»ΠΎ ALU, FPU, LSU ΠΈ SFU Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ΄ΡΠ°.
- ΠΠ°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΠ°Ρ ΡΠΈΡΠΈΠ½Π° Π²ΡΠ΄Π°ΡΠΈ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° (pipeline issue width).
- ΠΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½Π°Ρ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠ°Ρ ΠΏΠ°ΠΌΡΡΡ ΠΈ ΠΊΡΡΠΈ ΡΡΠΎΠ²Π½Π΅ΠΉ L1, L2 ΠΈ L3.
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ OpenCL 1.2.
- ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π° Π±Π°Π·Π΅ FPGA Altera Arria 10, Altera Stratix 10, Xilinx Alveo U50, U250, U280 ΠΈ Xilinx Versal VCK5000.
- Π Π°ΡΡΠΈΡΠ΅Π½Π½ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ: «tex» Π΄Π»Ρ ΡΡΠΊΠΎΡΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠ΅ΠΊΡΡΡΡ, vx_rast Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠ°ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠ΅ΠΉ, vx_rop Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠΎΠ², Π³Π»ΡΠ±ΠΈΠ½Ρ ΠΈ ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΠΎΡΡΠΈ, vx_imadd Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ «ΡΠΌΠ½ΠΎΠΆΠΈΡΡ ΠΈ ΡΠ»ΠΎΠΆΠΈΡΡ», vx_wspawn, vx_tmc ΠΈ vx_bar Π΄Π»Ρ Π°ΠΊΡΠΈΠ²Π°ΡΠΈΠΈ ΡΡΠΎΠ½ΡΠΎΠ² ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ ΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ² Π² Π½ΠΈΡ (wavefront, Π½Π°Π±ΠΎΡ Π½ΠΈΡΠ΅ΠΉ, ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΡ SIMD Engine), vx_split ΠΈ vx_join.
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠ΅ΠΉΠ΄Π΅ΡΠΎΠ² SPIR-V ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΡΠ΅ΡΠ΅Π· ΡΡΠ°Π½ΡΠ»ΡΡΠΈΡ Π² OpenCL.
- ΠΠ»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅ΡΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ, Π²ΠΊΠ»ΡΡΠ°ΡΡΠΈΠΉ Π°Π΄Π°ΠΏΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Vortex Π²Π°ΡΠΈΠ°Π½ΡΡ PoCL (ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΈ runtime OpenCL), LLVM/Clang, GCC ΠΈ Binutils.
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ ΡΠΈΠΌΡΠ»ΡΡΠΈΡ ΡΠ°Π±ΠΎΡΡ ΡΠΈΠΏΠ° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Verilator (Verilog-ΡΠΈΠΌΡΠ»ΡΡΠΎΡ), RTLSIM (ΡΠΈΠΌΡΠ»ΡΡΠΈΡ RTL) ΠΈ SimX (ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½Π°Ρ ΡΠΈΠΌΡΠ»ΡΡΠΈΡ).
ΠΠ»Ρ Π³ΡΠ°ΡΠΈΠΊΠΈ Π½Π° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΡ Vortex ΡΠ°Π·Π²ΠΈΠ²Π°Π΅ΡΡΡ ΠΎΡΠΊΡΡΡΡΠΉ GPU Skybox, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠΈΠΉ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ API Vulkan. ΠΡΠΎΡΠΎΡΠΈΠΏ Skybox, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ Π½Π° Π±Π°Π·Π΅ FPGA Altera Stratix 10 ΠΈ Π²ΠΊΠ»ΡΡΠ°ΡΡΠΈΠΉ 32 ΡΠ΄ΡΠ° (512 ΠΏΠΎΡΠΎΠΊΠΎΠ²), ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ» ΠΏΡΠΈ ΡΠ°ΡΡΠΎΡΠ΅ 230 MHz Π΄ΠΎΠ±ΠΈΡΡΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π·Π°Π»ΠΈΠ²ΠΊΠΈ Π² 3.7 Π³ΠΈΠ³Π°ΠΏΠΈΠΊΡΠ΅Π»Π΅ΠΉ Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ (29.4 Π³ΠΈΠ³Π°ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ). ΠΡΠΌΠ΅ΡΠ°Π΅ΡΡΡ, ΡΡΠΎ ΡΡΠΎ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΎΡΠΊΡΡΡΡΠΉ GPU Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠΉ ΠΈ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠΈΠΉ Vulkan.
Π‘ΡΠ΅Π΄ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Π²Π΅ΡΡΠΈΠΈ Vortex 2.1:
- ΠΠΎΠ±Π°Π²Π»Π΅Π½ API spawn_taskgroups Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΡΠ΄Π΅Ρ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΠΏΠ°ΠΌΡΡΡ ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠΈΡ Π²ΡΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π±Π°ΡΡΠ΅ΡΠΎΠ² Π½Π° ΠΏΠ°ΠΌΡΡΡ.
- ΠΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ Π½ΠΎΠ²ΠΎΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅ΠΌΡΡ (relocatable) Π±ΠΈΠ½Π°ΡΠ½ΡΡ ΡΠ΄Π΅Ρ.
- Π API ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ Π²ΡΠ·ΠΎΠ²Ρ vx_mem_reserve, vx_mem_access ΠΈ vx_mem_address.
- ΠΠΎΠ±Π°Π²Π»Π΅Π½ Π½ΠΎΠ²ΡΠΉ runtime API vx_check_occupancy.
- Π Π΄ΡΠ°ΠΉΠ²Π΅Ρ Π΄Π»Ρ GPU Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΎΠΏΡΠΈΡ Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ OpenCL-ΡΠ΅ΡΡΠΎΠ² Π½Π° Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΌ GPU.
- ΠΠΎΠ±Π°Π²Π»Π΅Π½Ρ ΡΠ΅ΡΡΡ OpenCL, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠ΅ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΠΏΠ°ΠΌΡΡΡ (psum, sgemm2, sgemm3).
- ΠΠΎΠ±Π°Π²Π»Π΅Π½Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎ Π°Π΄Π°ΠΏΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π΄Π»Ρ Vortex ΡΠ΅Π΄Π°ΠΊΡΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ libc ΠΈ librt.
- ΠΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΠ»ΠΈΡΠ½ΠΈΡ ΡΠΎΡΠ΅Π΄Π½ΠΈΡ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΡ Π±Π»ΠΎΠΊΠΎΠ² ΠΏΠ°ΠΌΡΡΠΈ (memory coalescing).
- ΠΡΠΎΠ²Π΅Π΄Π΅Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΌΠΈΠΊΡΠΎΠ°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ.
- ΠΠΎΠ±Π°Π²Π»Π΅Π½ Π½ΠΎΠ²ΡΠΉ ΡΠ±ΠΎΡΠΎΡΠ½ΡΠΉ ΡΠΊΡΠΈΠΏΡ, ΠΎΡΠ΄Π΅Π»ΡΡΡΠΈΠΉ ΠΈΡΡ ΠΎΠ΄Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ ΠΎΡ ΡΠ±ΠΎΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π°.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: opennet.ru