ΠΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½Π° Π΅ Π½ΠΎΠ²Π° ΡΠ΅Π΄Π°ΠΊΡΠΈΡ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° 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
