Last month, I received the SpacemiT K3 Pico-ITX Chassis Kit based on the company’s K3 16-core RISC-V SoC, and started the review with an unboxing, a teardown, and a first boot to Bianbu OS 4.0. Since the system features a 10Gbps Ethernet SFP+ cage, I also had to order a 10GbE SFP+ to Copper adapter, as my 10GbE networking gear is exclusively based on RJ45 ports.
In this review, I’ll check system information in Bianbu OS 4.0.1, run a few benchmarks, test 10GbE, GbE, and WiFi 6 networking performance, play YouTube videos at various resolutions, run AI workloads (LLM), check all/most features work as expected, and measure the power consumption of the SpacemiT K3 “Pico-ITX Chassis Kit” mini PC. It’s a fairly long review, so if you are short on time, you can check out the “what works, what doesn’t” section.
Bianbu OS 4.0 System Information
Before running anything, I updated the system:
|
1 2 |
sudo apt update sudo apt dist-upgrade |
594 packages were updated. For reference, the update also involved updating the EC (Embedded Controller) firmware:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
Current EC firmware 'SPACEMIT_DEB1-V00.12' is older than packaged firmware 'SPACEMIT_PICO_ITX-V00.16'. Starting automatic EC firmware update during package installation... [INFO] Automatic EC firmware update triggered during package installation. [INFO] Current RW: SPACEMIT_DEB1-V00.12 [INFO] Target FW : SPACEMIT_PICO_ITX-V00.16 [WARN] Do not remove power, reset the system, or interrupt the tool while flashing. [INFO] 1. Erasing flash region... Erasing 262144 bytes at offset 0... done. [ OK ] Erase completed. [INFO] 2. Writing firmware image... Reading 242688 bytes from /lib/firmware/k3-pico-itx/ec.bin... Writing to offset 0... Writing: [########################################] 100% done. [ OK ] Write completed. [INFO] 3. Reading back flash contents for MD5 verification... Reading 242688 bytes at offset 0... Reading: [########################################] 100% done. [ OK ] MD5 verification passed. [ OK ] Automatic EC firmware update finished successfully. [INFO] This reboots the EC firmware only. Linux is not rebooted automatically. [WARN] The power LED may blink and ectool may be unavailable briefly after the command. [INFO] Sending EC reboot command... [ OK ] EC reboot command sent. [INFO] Waiting 10 seconds for EC reboot to settle... |
Let’s double-check the system information after a reboot:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
jaufranc@CNXSOFT-spacemitk3picoitx:~$ sudo inxi -Fc0 System: Host: CNXSOFT-spacemitk3picoitx Kernel: 6.18.3-generic arch: riscv64 bits: 64 Console: pty pts/1 Distro: Bianbu 4.0.1 (Resolute Raccoon) Machine: Type: RISCV System: SpacemiT K3 Pico ITX details: N/A serial: HW3MPK3161280213 CPU: Info: 16-core model: Spacemit X100 variant: riscv bits: 64 type: MCP cache: L2: 10 MiB Speed (MHz): avg: 2200 min/max: 614/2400:2000 cores: 1: 2200 2: 2200 3: 2200 4: 2200 5: 2200 6: 2200 7: 2200 8: 2200 9: 2200 10: 2200 11: 2200 12: 2200 13: 2200 14: 2200 15: 2200 16: 2200 Graphics: Device-1: saturn-hee driver: spacemit_drm_drv v: N/A Device-2: saturn-edp driver: spacemit_drm_drv v: N/A Display: server: Xwayland v: 24.1.8 driver: N/A tty: 139x35 resolution: 1920x1080 API: EGL v: 1.4,1.5 drivers: pvr,swrast platforms: gbm,wayland,surfaceless,device API: OpenGL v: 3.3 vendor: mesa v: 24.0.1 note: console (EGL sourced) renderer: softpipe Info: Tools: api: eglinfo,glxinfo wl: kanshi,wlr-randr x11: xdriinfo, xdpyinfo, xprop, xrandr Audio: Device-1: simple-audio-card driver: asoc_simple_card Device-2: simple-audio-card driver: asoc_simple_card Device-3: simple-audio-card driver: N/A Device-4: simple-audio-card driver: N/A API: ALSA v: k6.18.3-generic status: kernel-api Server-1: PipeWire v: 1.6.2 status: active Network: Device-1: Realtek RTL8127 10GbE driver: r8127 IF: enP2p1s0 state: up speed: 10000 Mbps duplex: full mac: 50:0a:52:0b:82:18 Device-2: Realtek RTL8852BE PCIe 802.11ax Wireless Network driver: rtw89_8852be IF: wlP4p1s0 state: up mac: b0:8c:b3:9a:83:68 Device-3: k3-gmac driver: dwmac_spacemit_ethqos IF: end0 state: down mac: 50:0a:52:0b:e6:64 Device-4: rfkill-gpio driver: rfkill_gpio Device-5: dwmac-5.10a driver: N/A IF: end0 state: down mac: 50:0a:52:0b:e6:64 Device-6: dwmac-5.10a driver: N/A IF: enP2p1s0 state: up speed: 10000 Mbps duplex: full mac: 50:0a:52:0b:82:18 Device-7: dwmac-5.10a driver: N/A IF: wlP4p1s0 state: up mac: b0:8c:b3:9a:83:68 Bluetooth: Device-1: Realtek Bluetooth Radio driver: btusb type: USB Report: hciconfig ID: hci0 state: up address: B0:8C:B3:9A:83:69 bt-v: 5.3 Drives: Local Storage: total: 119.27 GiB used: 6.63 GiB (5.6%) ID-1: /dev/sda model: TY7B-128 size: 119.27 GiB Partition: ID-1: / size: 116.78 GiB used: 6.57 GiB (5.6%) fs: ext4 dev: /dev/sda3 ID-2: /boot size: 223.7 MiB used: 58.4 MiB (26.1%) fs: ext4 dev: /dev/sda2 Swap: Alert: No swap data was found. Sensors: System Temperatures: cpu: 69.0 C mobo: N/A Fan Speeds (rpm): cpu: 3372 Info: Memory: total: 16 GiB available: 15.6 GiB used: 1 GiB (6.4%) Processes: 326 Uptime: 5m Init: systemd Shell: Sudo inxi: 3.3.40 |
The system was updated to Bianbu 4.0.1 (Resolute Raccoon), which appears to be a stable release rather than the RC I got last month. The kernel is unchanged (Linux 6.18.3) and a few packages report updated versions. Total memory is now shown properly (16 GiB), and the idle CPU temperature is still fairly high.
K3 Pico-ITX SBC benchmarks
We already ran some headless benchmarks on a remote SpacemiT K3 platform last January, but let’s run them again with sbc-bench.sh to see if anything has changed.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
sudo ./sbc-bench.sh -r Starting to examine hardware/software for review purposes... sbc-bench v0.9.72 Installing needed tools: apt-get -f -qq -y install sysstat lshw links mmc-utils smartmontools stress-ng, p7zip 16.02, tinymembench, ramlat., mhz, cpufetch (can't build cpuminer) Done. Checking cpufreq OPP. Done. Executing tinymembench. Done. Executing RAM latency tester. Done. Executing OpenSSL benchmark. Done. Executing 7-zip benchmark. Done. Throttling test: heating up the device, 5 more minutes to wait. Done. Checking cpufreq OPP again. Done (15 minutes elapsed). Results validation: * Measured clockspeed not lower than advertised max CPU clockspeed * Background activity (%system) OK # SpacemiT K3 Pico ITX Tested with sbc-bench v0.9.72 on Fri, 19 Jun 2026 18:15:46 +0700. ### Performance baseline * memcpy: 6045.3 MB/s, memchr: 8614.8 MB/s, memset: 17932.7 MB/s * 16M latency: 148.9 137.2 146.6 139.9 146.9 137.7 136.9 148.8 * 128M latency: 158.5 160.3 158.0 157.5 161.1 155.0 157.7 170.9 * 7-zip MIPS (3 consecutive runs): 19597, 19762, 19673 (19680 avg), single-threaded: 2842 * `aes-256-cbc 292709.35k 695943.19k 1080477.95k 1252038.66k 1311831.38k 1316853.08k` * `aes-256-cbc 295223.54k 697550.74k 1080069.46k 1251781.63k 1311413.59k 1316580.01k` ### PCIe and storage devices: * Realtek RTL8127 10GbE: Speed 8GT/s, Width x2, driver in use: r8127, * Realtek RTL8852BE PCIe 802.11ax Wireless Network: Speed 2.5GT/s, Width x1, driver in use: rtw89_8852be, * 119.3GB KINGSTON TY7B-128 SPC-4 compliant UFS module: /dev/sda, Driver=ufshcd-spacemit * Winbond W25Q64DW SPI NOR flash (7 partitions: d420c000.spi: 8192KB, bootinfo: 128KB, fsbl: 512KB, env: 64KB, esos: 1024KB, opensbi: 384KB, uboot: 6080KB), drivers in use: spi-nor/fsl-quadspi/simple-pm-bus * Winbond W25Q64DW SPI NOR flash (6 partitions: bootinfo: 128KB, fsbl: 512KB, env: 64KB, esos: 1024KB, opensbi: 384KB, uboot: 6080KB), drivers in use: spi-nor/fsl-quadspi/simple-pm-bus ### Software versions: * Bianbu 4.0.1 (resolute) * Compiler: /usr/bin/gcc (Bianbu 15.2.0-16ubuntu1bb3) 15.2.0 / riscv64-linux-gnu * OpenSSL 3.5.5, built on 27 Jan 2026 (Library: OpenSSL 3.5.5 27 Jan 2026) ### Kernel info: * `/proc/cmdline: plymouth.prefer-fbcon plymouth.ignore-serial-consoles splash loglevel=8 mtdparts=d420c000.spi:128K@0(bootinfo),512K@128K(fsbl),64K@640K(env),1M@704K(esos),384K@1728K(opensbi),-@2112K(uboot) rootfstype=ext4 root=PARTUUID=db3dc9da-224f-4653-ab0b-9ac054511abe bootfs=PARTUUID=ab9f4fcc-b6ee-46c8-aea1-34b32a3f27c6 boot_mode=nor earlycon=sbi console=ttyS0,115200 random.trust_bootloader=1 unaligned_scalar_speed=fast unaligned_vector_speed=fast` * Kernel 6.18.3-generic / CONFIG_HZ=250 All known settings adjusted for performance. Device now ready for benchmarking. Once finished stop with [ctrl]-[c] to get info about throttling, frequency cap and too high background activity all potentially invalidating benchmark scores. All changes with storage and PCIe devices as well as suspicious dmesg contents will be reported too. Time CPU load %cpu %sys %usr %nice %io %irq Temp 18:15:55: 2400MHz 14.88 19% 0% 18% 0% 0% 0% °C |
Let’s see. memcpy’s memory bandwidth is 6045.3 MB/s instead of 5947.7 MB/s (minor improvement), 19,680 MIPS in 7-zip against 17,530 MIPS (quite better), and AES-256-CBC has dramatically improved with 1,316,580.01k vs 869,520.73k, probably because some crypto instructions were enabled…
You can check the full log for more details, and a quick comparison against the Rock 5B (RK3588), Raspberry Pi 5, and higher-end Orion O6 Armv9 motherboard. The SpacemiT K3 is fairly faster than the Rockchip RK3588 in the 7-zip multi-core benchmark, almost twice as fast as the Raspberry Pi 5 at stock frequency, but not quite to the level of the 12-core CIX P2 motherboard.
sbc-bench.sh still doesn’t detect the temperature, and this won’t be fixed because it appears Bianbu OS does that in a non-standard way. We can still list several temperature sensors:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
jaufranc@CNXSOFT-spacemitk3picoitx:~$ sensors pwmfan-isa-0000 Adapter: ISA adapter pwm1: 60% MANUAL CONTROL thermal_cluster3-virtual-0 Adapter: Virtual device temp1: +65.0°C thermal_cluster1-virtual-0 Adapter: Virtual device temp1: +65.0°C thermal_gpu-virtual-0 Adapter: Virtual device temp1: +68.0°C thermal_top-virtual-0 Adapter: Virtual device temp1: +67.0°C cros_ec-isa-000c Adapter: ISA adapter fan1: 3367 RPM thermal_cluster2-virtual-0 Adapter: Virtual device temp1: +68.0°C thermal_cluster0-virtual-0 Adapter: Virtual device temp1: +69.0°C thermal_vpu-virtual-0 Adapter: Virtual device temp1: +65.0°C |
To stress test the device, I launched stress-ng on the 8 X100 “Linux” cores…
|
1 2 3 |
jaufranc@CNXSOFT-spacemitk3picoitx:~$ stress-ng --cpu 8 stress-ng: info: [638194] defaulting to a 1 day run per stressor stress-ng: info: [638194] dispatching hogs: 8 cpu |
… and on the 8 A100 AI cores in a separate terminal:
|
1 2 3 4 |
jaufranc@CNXSOFT-spacemitk3picoitx:~$ echo $$ > /proc/set_ai_thread jaufranc@CNXSOFT-spacemitk3picoitx:~$ stress-ng --cpu 8 stress-ng: info: [638750] defaulting to a 1 day run per stressor stress-ng: info: [638750] dispatching hogs: 8 cpu |
We can see all sixteen cores under load. 0-7 X100 cores and 8-15 A100 cores.
The temperature is between 80 and 87°C under load, and the CPU fan is rotating at full speed or close to it (5208 RPM):
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
jaufranc@CNXSOFT-spacemitk3picoitx:~$ sensors pwmfan-isa-0000 Adapter: ISA adapter pwm1: 96% MANUAL CONTROL thermal_cluster3-virtual-0 Adapter: Virtual device temp1: +80.0°C thermal_cluster1-virtual-0 Adapter: Virtual device temp1: +82.0°C thermal_gpu-virtual-0 Adapter: Virtual device temp1: +83.0°C thermal_top-virtual-0 Adapter: Virtual device temp1: +81.0°C cros_ec-isa-000c Adapter: ISA adapter fan1: 5208 RPM thermal_cluster2-virtual-0 Adapter: Virtual device temp1: +82.0°C thermal_cluster0-virtual-0 Adapter: Virtual device temp1: +87.0°C thermal_vpu-virtual-0 Adapter: Virtual device temp1: +80.0°C |
Note that the test was done in a room with an ambient temperature of around 31°C.
Let’s now test the GPU with glmark2-es2-wayland, and the good news is that 3D hardware acceleration is enabled.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
jaufranc@CNXSOFT-spacemitk3picoitx:~$ glmark2-es2-wayland ======================================================= glmark2 2023.01 ======================================================= OpenGL Information GL_VENDOR: Imagination Technologies GL_RENDERER: PowerVR B-Series BXM-4-64 GL_VERSION: OpenGL ES 3.2 build 24.2@6603887 Surface Config: buf=32 r=8 g=8 b=8 a=8 depth=24 stencil=0 samples=0 Surface Size: 800x600 windowed ======================================================= [build] use-vbo=false: FPS: 510 FrameTime: 1.961 ms [build] use-vbo=true: FPS: 2300 FrameTime: 0.435 ms [texture] texture-filter=nearest: FPS: 2485 FrameTime: 0.402 ms [texture] texture-filter=linear: FPS: 1900 FrameTime: 0.526 ms [texture] texture-filter=mipmap: FPS: 1854 FrameTime: 0.539 ms [shading] shading=gouraud: FPS: 1118 FrameTime: 0.895 ms [shading] shading=blinn-phong-inf: FPS: 1098 FrameTime: 0.911 ms [shading] shading=phong: FPS: 958 FrameTime: 1.045 ms [shading] shading=cel: FPS: 899 FrameTime: 1.114 ms [bump] bump-render=high-poly: FPS: 422 FrameTime: 2.375 ms [bump] bump-render=normals: FPS: 2053 FrameTime: 0.487 ms [bump] bump-render=height: FPS: 1810 FrameTime: 0.553 ms [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 784 FrameTime: 1.276 ms [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 270 FrameTime: 3.716 ms [pulsar] light=false:quads=5:texture=false: FPS: 2428 FrameTime: 0.412 ms [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 274 FrameTime: 3.650 ms [desktop] effect=shadow:windows=4: FPS: 1142 FrameTime: 0.876 ms [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 246 FrameTime: 4.067 ms [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 249 FrameTime: 4.019 ms [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 350 FrameTime: 2.857 ms [ideas] speed=duration: FPS: 1472 FrameTime: 0.680 ms [jellyfish] <default>: FPS: 524 FrameTime: 1.908 ms [terrain] <default>: FPS: 32 FrameTime: 31.401 ms [shadow] <default>: FPS: 509 FrameTime: 1.965 ms [refract] <default>: FPS: 66 FrameTime: 15.292 ms [conditionals] fragment-steps=0:vertex-steps=0: FPS: 2478 FrameTime: 0.404 ms [conditionals] fragment-steps=5:vertex-steps=0: FPS: 999 FrameTime: 1.001 ms [conditionals] fragment-steps=0:vertex-steps=5: FPS: 2436 FrameTime: 0.411 ms [function] fragment-complexity=low:fragment-steps=5: FPS: 1460 FrameTime: 0.685 ms [function] fragment-complexity=medium:fragment-steps=5: FPS: 765 FrameTime: 1.308 ms [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 1441 FrameTime: 0.694 ms [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 1440 FrameTime: 0.694 ms [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 1329 FrameTime: 0.752 ms ======================================================= glmark2 Score: 1153 ======================================================= |
1,153 points in glmark2-es2-wayland compares to 2036 points for the Raspberry Pi 5, and 4000-4500+ points for Rockchip RK3588 platforms. GPU performance can vary a lot depending on the driver used, so there may be more performance to be extracted here.
I then ran the Speedometer 2.0 performance in Chromium to evaluate web browsing (single-core) performance: 39.4 runs per minute. The Pi 5 goes 63.4 runs per minute. This test can vary a lot depending on optimizations, and for reference, two RK3588 targets got completely different scores: the NanoPi R6 achieved 17.2 rpm, and the Khadas Edge 2 Pro managed 80.7 rpm, both in Chromium.
I also repeated the test with the new Speedometer 3.1 benchmark to get a reference point for future reviews.
3D graphics acceleration also works in the Chromium web browser. The WebGL Aquarium demo was rendered at 60 FPS with 500 fish, and still managed 25 FPS with 5000 fish.
Going to chrome://gpu confirms WebGL is enabled, as well as OpenGL. I can also see “Video Decode: Hardware accelerated” there, so let’s try YouTube.
YouTube video playback up to 4K 60 FPS
Since I haven’t always had the best experience with YouTube video playback on RISC-V (and Arm) platforms, I found a 4K 60 FPS video and started at 720p60.

Only a few frames dropped at the beginning, but after that, the video played great. Same results with 1080p60. It’s starting to look good.

The user experience is still great at 1440p60 (2560×1440 @ 60 FPS) with only a few frames dropped at the beginning.

4K60 FPS video streaming was almost perfect, except for two micro-freezes leading to 38 dropped frames out of 16,183 playing the video for a little over 4 minutes.
So my experience was better than expected here, although it was not perfect due to two very short freezes (several hundred milliseconds) at 4K resolution. Note that the video uses the VP9 video codec, and AV1 hardware video decoding is not supported by the K3’s VPU.
Storage and USB performance
I started storage testing with the built-in 128GB UFS storage:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
jaufranc@CNXSOFT-spacemitk3picoitx:~$ iozone -e -I -a -s 1000M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2 Iozone: Performance Test of File I/O Version $Revision: 3.508 $ Compiled for 64 bit mode. Build: linux Output is in kBytes/sec random random bkwd record stride kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 1024000 4 71647 101315 35357 35982 36039 102591 1024000 16 163261 163907 270028 271170 103802 152887 1024000 512 167441 168344 799935 804112 471137 167148 1024000 1024 167797 167693 779113 783363 491170 167492 1024000 16384 168790 168927 853808 838850 799633 169225 iozone test complete. |
UFS is a big improvement over systems with eMMC flash, with 853 MB/s read speed, 168 MB/s write speed, and decent random I/O performance.
The K3 Pico-ITX SBC features a M.2 Key-M socket, so I also installed a 128GB MakerDisk M.2 NVMe (PCIe Gen3 x4) 2280 SSD rated up to 1800 MB/s reads, and 560 MB/s writes.
After starting the board, I noticed I couldn’t mount the drive:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
aufranc@CNXSOFT-spacemitk3picoitx:~$ sudo dmesg | grep nvme | more [ 2.655887] nvme nvme0: pci function 0000:01:00.0 [ 2.655898] nvme 0000:01:00.0: enabling device (0000 -> 0002) [ 3.309803] nvme nvme0: allocated 128 MiB host memory buffer (32 segments). [ 3.332363] nvme nvme0: 8/0/0 default/read/poll queues [ 3.350698] nvme0n1: p1 p2 [ 10.793094] nvme nvme0: using unchecked data buffer [ 472.935127] nvme nvme0: controller is down; will reset: CSTS=0xffffffff, PCI_STATUS=0x10 [ 472.935134] nvme nvme0: Does your device have a faulty power saving mode enabled? [ 472.935138] nvme nvme0: Try "nvme_core.default_ps_max_latency_us=0 pcie_aspm=off pcie_port_pm=off" and report a bug [ 473.095509] nvme 0000:01:00.0: Unable to change power state from D3cold to D0, device inaccessible [ 473.134845] nvme nvme0: Disabling device after reset failure: -19 [ 473.154268] FAT-fs (nvme0n1p1): unable to read boot sector [ 475.435467] Buffer I/O error on dev nvme0n1p1, logical block 0, async page read [ 475.447004] Buffer I/O error on dev nvme0n1p1, logical block 0, async page read [ 475.460892] nvme nvme0: Identify namespace failed (-5) [ 475.463308] Buffer I/O error on dev nvme0n1p2, logical block 0, async page read [ 475.475055] Buffer I/O error on dev nvme0n1p2, logical block 0, async page read [ 3014.228866] UDF-fs: error (device nvme0n1p2): udf_read_tagged: read failed, block=256, location=25 6 [ 3014.235309] UDF-fs: error (device nvme0n1p2): udf_read_tagged: read failed, block=247863295, locat ion=247863295 |
The kernel log tells us to change some parameters related to ASPM and NVME latency. I eventually found /boot/env_k3.txt to add the recommended arguments:
|
1 2 3 4 5 6 7 |
jaufranc@CNXSOFT-spacemitk3picoitx:~$ cat /boot/env_k3.txt knl_name=vmlinuz-6.18.3-generic ramdisk_name=initrd.img-6.18.3-generic dtb_dir=spacemit/6.18.3-generic ramdisk_addr=0x130000000 loglevel=8 commonargs=setenv bootargs plymouth.prefer-fbcon plymouth.ignore-serial-consoles splash nvme_core.default_ps_max_latency_us=0 pcie_aspm=off pcie_port_pm=off |
After a reboot, it was even worse:
|
1 2 |
aufranc@CNXSOFT-spacemitk3picoitx:~$ sudo dmesg | grep nvme [ 4.166838] nvme 0000:01:00.0: of_irq_parse_pci: failed with rc=134 |
However, after a proper power cycle, leaving the machine turned off for a minute or so, I could mount the drive:
|
1 2 |
jaufranc@CNXSOFT-spacemitk3picoitx:/media/nvme0n1p2$ mount | grep nvme /dev/nvme0n1p2 on /media/nvme0n1p2 type ext4 (rw,nosuid,nodev,noexec,relatime,errors=remount-ro,shutdown,user) |
However, running iozone ended up with an input/output error:
|
1 2 3 4 5 6 |
jaufranc@CNXSOFT-spacemitk3picoitx:/media/nvme0n1p2$ sudo iozone -e -I -a -s 1000M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2 random random bkwd record stride kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 1024000 4 106870 193053 55646 12548 Error reading block at 638320640 read: Input/output error |
I did some more modifications to the commonargs:
|
1 |
commonargs=setenv bootargs plymouth.prefer-fbcon plymouth.ignore-serial-consoles splash nvme_core.default_ps_max_latency_us=0 pcie_aspm=off pci=noacpi |
It failed the first time as above, and after another reboot, I decided to run the test with a smaller 10MB test file:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
jaufranc@CNXSOFT-spacemitk3picoitx:~$ sudo iozone -e -I -a -s 10M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2 random random bkwd record stride kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 10240 4 72422 104558 35662 35619 35611 101492 10240 16 165781 161191 202659 201316 88049 159454 10240 512 165586 157805 470110 393846 321708 161455 10240 1024 134971 171736 605805 613428 595457 167325 iozone test complete. jaufranc@CNXSOFT-spacemitk3picoitx:~$ sudo iozone -e -I -a -s 10M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2 random random bkwd record stride kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 10240 4 73293 104478 35051 35631 35777 103374 10240 16 156519 160698 170396 178936 92194 138772 10240 512 172454 164645 523012 608543 461324 168562 10240 1024 168715 159182 715782 738070 698973 161496 iozone test complete. |
It went through, so I increased the size to 100MB:
|
1 2 3 4 5 6 7 8 9 10 11 |
jaufranc@CNXSOFT-spacemitk3picoitx:~$ sudo iozone -e -I -a -s 100M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2 random random bkwd record stride kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 102400 4 73750 106638 35932 36294 36546 109479 102400 16 163970 160998 261955 260986 103848 163731 102400 512 166443 165016 748515 775123 465598 167486 102400 1024 165882 168132 734186 765093 471246 169355 102400 16384 167272 166704 750830 755847 733250 165496 iozone test complete. |
and tried my luck again with a 1GB test file, and this time I worked:
|
1 2 3 4 5 6 7 8 9 10 |
jaufranc@CNXSOFT-spacemitk3picoitx:~$ sudo iozone -e -I -a -s 1000M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2 random random bkwd record stride kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 1024000 4 74424 112123 36619 36644 36598 109991 1024000 16 161008 164771 257409 257743 103015 152768 1024000 512 168354 168426 809578 801678 481449 166173 1024000 1024 168565 168129 847675 849113 612307 168045 1024000 16384 167918 168174 855184 850107 772171 167669 iozone test complete. |
About 855MB/s sequential reads and 167 MB/s sequential writes are quite lower than expected, something similar to a PCIe Gen3 x1 connection.
However, we can clearly see a PCIe Gen3 x4 connection is used for the NVMe controller:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
jaufranc@CNXSOFT-spacemitk3picoitx:~$ sudo lspci -vvv -s 0000:01:00.0 0000:01:00.0 Non-Volatile memory controller: Phison Electronics Corporation PS5013-E13 PCIe3 NVMe Controller (DRAM-less) (rev 01) (prog-if 02 [NVM Express]) Subsystem: Phison Electronics Corporation PS5013-E13 PCIe3 NVMe Controller (DRAM-less) Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+ Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- Latency: 0 Interrupt: pin A routed to IRQ 0 Region 0: Memory at 1100200000 (64-bit, non-prefetchable) [size=16K] Capabilities: [80] Express (v2) Endpoint, IntMsgNum 0 DevCap: MaxPayload 256 bytes, PhantFunc 0, Latency L0s unlimited, L1 unlimited ExtTag+ AttnBtn- AttnInd- PwrInd- RBE+ FLReset+ SlotPowerLimit 0W TEE-IO- DevCtl: CorrErr- NonFatalErr- FatalErr- UnsupReq- RlxdOrd+ ExtTag+ PhantFunc- AuxPwr- NoSnoop+ FLReset- MaxPayload 128 bytes, MaxReadReq 512 bytes DevSta: CorrErr- NonFatalErr- FatalErr- UnsupReq- AuxPwr- TransPend- LnkCap: Port #1, Speed 8GT/s, Width x4, ASPM L1, Exit Latency L1 unlimited ClockPM- Surprise- LLActRep- BwNot- ASPMOptComp+ LnkCtl: ASPM Disabled; RCB 64 bytes, LnkDisable- CommClk- ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt- FltModeDis- LnkSta: Speed 8GT/s, Width x4 TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt- DevCap2: Completion Timeout: Range ABCD, TimeoutDis+ NROPrPrP- LTR+ 10BitTagComp- 10BitTagReq- OBFF Not Supported, ExtFmt+ EETLPPrefix- EmergencyPowerReduction Not Supported, EmergencyPowerReductionInit- FRS- TPHComp- ExtTPHComp- AtomicOpsCap: 32bit- 64bit- 128bitCAS- DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis- AtomicOpsCtl: ReqEn- IDOReq- IDOCompl- LTR+ EmergencyPowerReductionReq- 10BitTagReq- OBFF Disabled, EETLPPrefixBlk- LnkCap2: Supported Link Speeds: 2.5-8GT/s, Crosslink- Retimer- 2Retimers- DRS- LnkCtl2: Target Link Speed: 8GT/s, EnterCompliance- SpeedDis- Transmit Margin: Normal Operating Range, EnterModifiedCompliance- ComplianceSOS- Compliance Preset/De-emphasis: -6dB de-emphasis, 0dB preshoot LnkSta2: Current De-emphasis Level: -6dB, EqualizationComplete+ EqualizationPhase1+ EqualizationPhase2+ EqualizationPhase3+ LinkEqualizationRequest- Retimer- 2Retimers- CrosslinkRes: unsupported, FltMode- Capabilities: [d0] MSI-X: Enable+ Count=9 Masked- Vector table: BAR=0 offset=00002000 PBA: BAR=0 offset=00003000 Capabilities: [e0] MSI: Enable- Count=1/8 Maskable+ 64bit+ Address: 0000000000000000 Data: 0000 Masking: 00000000 Pending: 00000000 Capabilities: [f8] Power Management version 3 Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-) Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME- Capabilities: [100 v1] Latency Tolerance Reporting Max snoop latency: 0ns Max no snoop latency: 0ns Capabilities: [110 v1] L1 PM Substates L1SubCap: PCI-PM_L1.2+ PCI-PM_L1.1+ ASPM_L1.2+ ASPM_L1.1+ L1_PM_Substates+ PortCommonModeRestoreTime=10us PortTPowerOnTime=220us L1SubCtl1: PCI-PM_L1.2- PCI-PM_L1.1- ASPM_L1.2- ASPM_L1.1- T_CommonMode=0us LTR1.2_Threshold=0ns L1SubCtl2: T_PwrOn=10us Capabilities: [200 v2] Advanced Error Reporting UESta: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol- UncorrIntErr- BlockedTLP- AtomicOpBlocked- TLPBlockedErr- PoisonTLPBlocked- DMWrReqBlocked- IDECheck- MisIDETLP- PCRC_CHECK- TLPXlatBlocked- UEMsk: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol- UncorrIntErr+ BlockedTLP- AtomicOpBlocked- TLPBlockedErr- PoisonTLPBlocked- DMWrReqBlocked- IDECheck- MisIDETLP- PCRC_CHECK- TLPXlatBlocked- UESvrt: DLP+ SDES- TLP- FCP+ CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP+ ECRC- UnsupReq- ACSViol- UncorrIntErr+ BlockedTLP- AtomicOpBlocked- TLPBlockedErr- PoisonTLPBlocked- DMWrReqBlocked- IDECheck- MisIDETLP- PCRC_CHECK- TLPXlatBlocked- CESta: RxErr- BadTLP- BadDLLP- Rollover- Timeout- AdvNonFatalErr- CorrIntErr- HeaderOF- CEMsk: RxErr- BadTLP- BadDLLP- Rollover- Timeout- AdvNonFatalErr+ CorrIntErr+ HeaderOF- AERCap: First Error Pointer: 00, ECRCGenCap- ECRCGenEn- ECRCChkCap+ ECRCChkEn- MultHdrRecCap- MultHdrRecEn- TLPPfxPres- HdrLogCap- HeaderLog: 00000000 00000000 00000000 00000000 Capabilities: [300 v1] Secondary PCI Express LnkCtl3: LnkEquIntrruptEn- PerformEqu- LaneErrStat: 0 Kernel driver in use: nvme Kernel modules: nvme |
It’s unclear why the performance is not better, although there may be some clues when we check the log for the drive, as one of the temperature sensors reports 83°C:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
jaufranc@CNXSOFT-spacemitk3picoitx:~$ sudo nvme smart-log /dev/nvme0 Smart Log for NVME device:nvme0 namespace-id:ffffffff critical_warning : 0 temperature : 60 °C (333 K, 140 °F) available_spare : 100% available_spare_threshold : 5% percentage_used : 0% endurance group critical warning summary: 0 Data Units Read : 125889 (64.46 GB) Data Units Written : 195403 (100.05 GB) host_read_commands : 3401486 host_write_commands : 4298621 controller_busy_time : 28 power_cycles : 27 power_on_hours : 333 unsafe_shutdowns : 5 media_errors : 0 num_err_log_entries : 0 Warning Temperature Time : 0 Critical Composite Temperature Time : 0 Temperature Sensor 1 : 83 °C (356 K, 181 °F) Thermal Management T1 Trans Count : 4 Thermal Management T2 Trans Count : 1 Thermal Management T1 Total Time : 1684 Thermal Management T2 Total Time : 16 |
The “Critical Composite Temperature Time” is shown to be zero, so it’s unclear whether an SSD heatsink may help here.
Time to test the six USB ports using lsusb and iozone as showns the the USB-C OTG port below.
|
1 2 3 4 5 6 |
jaufranc@CNXSOFT-spacemitk3picoitx:/media/sdb3$ lsusb -t | grep uas |__ Port 001: Dev 002, If 0, Class=Mass Storage, Driver=uas, 5000M jaufranc@CNXSOFT-spacemitk3picoitx:/media/sdb3$ sudo iozone -e -I -a -s 1000M -r 16384k -i 0 -i 1 random random bkwd record stride kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 1024000 16384 358556 360290 352518 351911 |
352 MB/s is on the low side, as I’d usually expect about 420 MB/s for a 5Gbps USB port.
Summary for the six USB ports from top left to right
- USB 2.0 #1 – 480 Mbps – ~35MB/s read speed
- USB 2.0 #1 – 480 Mbps – ~35MB/s read speed
- USB 2.0 #1 – 480 Mbps – ~35MB/s read speed
- USB 2.0 #1 – 480 Mbps – ~35MB/s read speed
- USB 3.2 Type-C #1 – 5000 Mbps – ~352 MB/s read speed
- USB 3.2 Type-C #2
- ORICO NVMe enclosure – Drive not detected; Note: connected through the USB 3.2 Type-A port on the UGREEN dock used for power and HDMI video output
- Seagate USB 3.0 hard drive – 5,000 Mbps – Connected via UGREEN dock. Speed not tested since the hard drive would be the bottleneck…
All ports work, but at lower speed than expected. The USB-C port used for power and DP Alt mode appears to have an issue recognizing one of my drives. It’s unclear whether it’s the USB-C port itself, or a compatibility issue with the UGREEN dock.
10GbE and GbE, WiFi, and Bluetooth
10GbE networking is one of the highlights of the K1 Pico-ITX motherboard, but it features an SFP+ cage, so I needed a 10GbE RJ45 adapter for my testbed. The cheapest I could find that met my requirements (10Gbps Ethernet) was the Xicom XC-SPF+-T30 sold for about $18 on AliExpress. One small downside that doesn’t matter to me is that it only supports 2.5GbE, 5GbE, or 10GbE, and not gigabit Ethernet and lower link speeds.
Installation couldn’t be easier: insert the adapter in the SFP+ cage, until it clicks. To remove it, lift the golden bracket.
I first connected it to a 2.5GbE switch, so we can try to see if 2.5Gbps Ethernet is indeed supported. The UP Xtreme i11 Edge mini PC was used on the other side. iperf3 was used for testing.
- Download
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
jaufranc@CNXSOFT-spacemitk3picoitx:~$ iperf3 -t 60 -c 192.168.31.12 -i 10 -R Connecting to host 192.168.31.12, port 5201 Reverse mode, remote host 192.168.31.12 is sending [ 5] local 192.168.31.38 port 50550 connected to 192.168.31.12 port 5201 [ ID] Interval Transfer Bitrate [ 5] 0.00-10.00 sec 2.74 GBytes 2.35 Gbits/sec [ 5] 10.00-20.00 sec 2.74 GBytes 2.35 Gbits/sec [ 5] 20.00-30.00 sec 2.74 GBytes 2.35 Gbits/sec [ 5] 30.00-40.00 sec 2.74 GBytes 2.35 Gbits/sec [ 5] 40.00-50.00 sec 2.74 GBytes 2.35 Gbits/sec [ 5] 50.00-60.00 sec 2.74 GBytes 2.35 Gbits/sec - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate Retr [ 5] 0.00-60.00 sec 16.4 GBytes 2.35 Gbits/sec 0 sender [ 5] 0.00-60.00 sec 16.4 GBytes 2.35 Gbits/sec receiver |
- Upload
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
jaufranc@CNXSOFT-spacemitk3picoitx:~$ iperf3 -t 60 -c 192.168.31.12 -i 10 Connecting to host 192.168.31.12, port 5201 [ 5] local 192.168.31.38 port 59464 connected to 192.168.31.12 port 5201 [ ID] Interval Transfer Bitrate Retr Cwnd [ 5] 0.00-10.01 sec 2.48 GBytes 2.13 Gbits/sec 11302 102 KBytes [ 5] 10.01-20.01 sec 2.49 GBytes 2.14 Gbits/sec 11575 103 KBytes [ 5] 20.01-30.01 sec 2.51 GBytes 2.16 Gbits/sec 11635 87.7 KBytes [ 5] 30.01-40.01 sec 2.51 GBytes 2.16 Gbits/sec 12529 99.0 KBytes [ 5] 40.01-50.01 sec 2.50 GBytes 2.15 Gbits/sec 13010 73.5 KBytes [ 5] 50.01-60.01 sec 2.51 GBytes 2.15 Gbits/sec 12443 70.7 KBytes - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate Retr [ 5] 0.00-60.01 sec 15.0 GBytes 2.15 Gbits/sec 72494 sender [ 5] 0.00-60.01 sec 15.0 GBytes 2.15 Gbits/sec receiver iperf Done. |
- Full-duplex (bidirectional)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
jaufranc@CNXSOFT-spacemitk3picoitx:~$ iperf3 -t 60 -c 192.168.31.12 -i 10 --bidir Connecting to host 192.168.31.12, port 5201 [ 5] local 192.168.31.38 port 60250 connected to 192.168.31.12 port 5201 [ 7] local 192.168.31.38 port 60266 connected to 192.168.31.12 port 5201 [ ID][Role] Interval Transfer Bitrate Retr Cwnd [ 5][TX-C] 0.00-10.01 sec 2.52 GBytes 2.17 Gbits/sec 15084 100 KBytes [ 7][RX-C] 0.00-10.01 sec 2.74 GBytes 2.35 Gbits/sec [ 5][TX-C] 10.01-20.00 sec 2.53 GBytes 2.17 Gbits/sec 14617 107 KBytes [ 7][RX-C] 10.01-20.00 sec 2.73 GBytes 2.35 Gbits/sec [ 5][TX-C] 20.00-30.01 sec 2.52 GBytes 2.16 Gbits/sec 15252 77.8 KBytes [ 7][RX-C] 20.00-30.01 sec 2.73 GBytes 2.35 Gbits/sec [ 5][TX-C] 30.01-40.01 sec 2.53 GBytes 2.17 Gbits/sec 15141 103 KBytes [ 7][RX-C] 30.01-40.01 sec 2.73 GBytes 2.35 Gbits/sec [ 5][TX-C] 40.01-50.00 sec 2.51 GBytes 2.16 Gbits/sec 14892 102 KBytes [ 7][RX-C] 40.01-50.00 sec 2.73 GBytes 2.35 Gbits/sec [ 5][TX-C] 50.00-60.01 sec 2.52 GBytes 2.16 Gbits/sec 15451 107 KBytes [ 7][RX-C] 50.00-60.01 sec 2.74 GBytes 2.35 Gbits/sec - - - - - - - - - - - - - - - - - - - - - - - - - [ ID][Role] Interval Transfer Bitrate Retr [ 5][TX-C] 0.00-60.01 sec 15.1 GBytes 2.16 Gbits/sec 90437 sender [ 5][TX-C] 0.00-60.01 sec 15.1 GBytes 2.16 Gbits/sec receiver [ 7][RX-C] 0.00-60.01 sec 16.4 GBytes 2.35 Gbits/sec 0 sender [ 7][RX-C] 0.00-60.01 sec 16.4 GBytes 2.35 Gbits/sec receiver iperf Done. |
2.35 Gbps downloads and 2.16 Gbps uploads are pretty good, albeit not perfect on the upload side.
Let’s now do the same test, but with 10GbE networking using an iKOOLCORE R2 Max mini PC running OpenWrt on the other side.
- Download
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
jaufranc@CNXSOFT-spacemitk3picoitx:~$ iperf3 -t 60 -c 192.168.4.1 -i 10 -R Connecting to host 192.168.4.1, port 5201 Reverse mode, remote host 192.168.4.1 is sending [ 5] local 192.168.4.133 port 41232 connected to 192.168.4.1 port 5201 [ ID] Interval Transfer Bitrate [ 5] 0.00-10.01 sec 5.96 GBytes 5.11 Gbits/sec [ 5] 10.01-20.01 sec 5.93 GBytes 5.10 Gbits/sec [ 5] 20.01-30.01 sec 5.95 GBytes 5.11 Gbits/sec [ 5] 30.01-40.01 sec 5.94 GBytes 5.10 Gbits/sec [ 5] 40.01-50.01 sec 5.99 GBytes 5.14 Gbits/sec [ 5] 50.01-60.01 sec 5.94 GBytes 5.11 Gbits/sec - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate Retr [ 5] 0.00-59.99 sec 35.7 GBytes 5.11 Gbits/sec 48137 sender [ 5] 0.00-60.01 sec 35.7 GBytes 5.11 Gbits/sec receiver iperf Done. |
- Upload
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
jaufranc@CNXSOFT-spacemitk3picoitx:~$ iperf3 -t 60 -c 192.168.4.1 -i 10 Connecting to host 192.168.4.1, port 5201 [ 5] local 192.168.4.133 port 60148 connected to 192.168.4.1 port 5201 [ ID] Interval Transfer Bitrate Retr Cwnd [ 5] 0.00-10.00 sec 11.0 GBytes 9.40 Gbits/sec 0 2.22 MBytes [ 5] 10.00-20.00 sec 11.0 GBytes 9.41 Gbits/sec 0 2.22 MBytes [ 5] 20.00-30.01 sec 11.0 GBytes 9.41 Gbits/sec 0 2.22 MBytes [ 5] 30.01-40.01 sec 11.0 GBytes 9.41 Gbits/sec 0 2.22 MBytes [ 5] 40.01-50.01 sec 11.0 GBytes 9.41 Gbits/sec 0 2.22 MBytes [ 5] 50.01-60.01 sec 11.0 GBytes 9.41 Gbits/sec 0 2.22 MBytes - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate Retr [ 5] 0.00-60.01 sec 65.7 GBytes 9.41 Gbits/sec 0 sender [ 5] 0.00-59.99 sec 65.7 GBytes 9.41 Gbits/sec receiver iperf Done. |
Upload is fine, but not so much download. If I retry upload, I get similar results each time 5.xx Gbps. Just in case the transfer is CPU-bound, let’s run iperf3 in parallel mode:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
jaufranc@CNXSOFT-spacemitk3picoitx:~$ iperf3 -t 60 -c 192.168.4.1 -P 2 -i 10 -R Connecting to host 192.168.4.1, port 5201 Reverse mode, remote host 192.168.4.1 is sending [ 5] local 192.168.4.133 port 40002 connected to 192.168.4.1 port 5201 [ 7] local 192.168.4.133 port 40010 connected to 192.168.4.1 port 5201 [ ID] Interval Transfer Bitrate [ 5] 0.00-10.00 sec 5.40 GBytes 4.64 Gbits/sec [ 7] 0.00-10.00 sec 5.38 GBytes 4.62 Gbits/sec [SUM] 0.00-10.00 sec 10.8 GBytes 9.26 Gbits/sec - - - - - - - - - - - - - - - - - - - - - - - - - [ 5] 10.00-20.00 sec 5.53 GBytes 4.75 Gbits/sec [ 7] 10.00-20.00 sec 5.39 GBytes 4.63 Gbits/sec [SUM] 10.00-20.00 sec 10.9 GBytes 9.38 Gbits/sec - - - - - - - - - - - - - - - - - - - - - - - - - [ 5] 20.00-30.00 sec 5.51 GBytes 4.73 Gbits/sec [ 7] 20.00-30.00 sec 5.37 GBytes 4.61 Gbits/sec [SUM] 20.00-30.00 sec 10.9 GBytes 9.34 Gbits/sec - - - - - - - - - - - - - - - - - - - - - - - - - [ 5] 30.00-40.01 sec 5.51 GBytes 4.73 Gbits/sec [ 7] 30.00-40.01 sec 5.42 GBytes 4.66 Gbits/sec [SUM] 30.00-40.01 sec 10.9 GBytes 9.39 Gbits/sec - - - - - - - - - - - - - - - - - - - - - - - - - [ 5] 40.01-50.01 sec 5.51 GBytes 4.74 Gbits/sec [ 7] 40.01-50.01 sec 5.42 GBytes 4.65 Gbits/sec [SUM] 40.01-50.01 sec 10.9 GBytes 9.39 Gbits/sec - - - - - - - - - - - - - - - - - - - - - - - - - [ 5] 50.01-60.01 sec 5.52 GBytes 4.74 Gbits/sec [ 7] 50.01-60.01 sec 5.41 GBytes 4.65 Gbits/sec [SUM] 50.01-60.01 sec 10.9 GBytes 9.39 Gbits/sec - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate Retr [ 5] 0.00-59.99 sec 33.0 GBytes 4.72 Gbits/sec 24453 sender [ 5] 0.00-60.01 sec 33.0 GBytes 4.72 Gbits/sec receiver [ 7] 0.00-59.99 sec 32.4 GBytes 4.64 Gbits/sec 22138 sender [ 7] 0.00-60.01 sec 32.4 GBytes 4.64 Gbits/sec receiver [SUM] 0.00-59.99 sec 65.4 GBytes 9.36 Gbits/sec 46591 sender [SUM] 0.00-60.01 sec 65.4 GBytes 9.36 Gbits/sec receiver iperf Done. |
9.36 Gbps is excellent. Time to test full-duplex with three parallel streams to see if the system can handle bi-directional 10Gbps Ethernet at full speed:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
jaufranc@CNXSOFT-spacemitk3picoitx:~$ iperf3 -t 60 -c 192.168.4.1 -P 3 -i 10 --bidir Connecting to host 192.168.4.1, port 5201 [ 5] local 192.168.4.133 port 47538 connected to 192.168.4.1 port 5201 [ 7] local 192.168.4.133 port 47552 connected to 192.168.4.1 port 5201 [ 9] local 192.168.4.133 port 47562 connected to 192.168.4.1 port 5201 [ 11] local 192.168.4.133 port 47570 connected to 192.168.4.1 port 5201 [ 13] local 192.168.4.133 port 47574 connected to 192.168.4.1 port 5201 [ 15] local 192.168.4.133 port 47590 connected to 192.168.4.1 port 5201 [ ID][Role] Interval Transfer Bitrate Retr Cwnd [ 5][TX-C] 0.00-10.01 sec 2.66 GBytes 2.28 Gbits/sec 0 2.30 MBytes [ 7][TX-C] 0.00-10.01 sec 5.61 GBytes 4.82 Gbits/sec 0 3.64 MBytes [ 9][TX-C] 0.00-10.01 sec 2.68 GBytes 2.30 Gbits/sec 0 2.46 MBytes [SUM][TX-C] 0.00-10.01 sec 10.9 GBytes 9.40 Gbits/sec 0 [ 11][RX-C] 0.00-10.01 sec 4.08 GBytes 3.51 Gbits/sec [ 13][RX-C] 0.00-10.01 sec 4.14 GBytes 3.55 Gbits/sec [ 15][RX-C] 0.00-10.01 sec 2.47 GBytes 2.12 Gbits/sec [SUM][RX-C] 0.00-10.01 sec 10.7 GBytes 9.18 Gbits/sec - - - - - - - - - - - - - - - - - - - - - - - - - ... - - - - - - - - - - - - - - - - - - - - - - - - - [ 5][TX-C] 50.01-60.01 sec 2.67 GBytes 2.30 Gbits/sec 0 4.19 MBytes [ 7][TX-C] 50.01-60.01 sec 5.60 GBytes 4.81 Gbits/sec 0 3.64 MBytes [ 9][TX-C] 50.01-60.01 sec 2.67 GBytes 2.29 Gbits/sec 0 4.31 MBytes [SUM][TX-C] 50.01-60.01 sec 10.9 GBytes 9.40 Gbits/sec 0 [ 11][RX-C] 50.01-60.01 sec 4.11 GBytes 3.53 Gbits/sec [ 13][RX-C] 50.01-60.01 sec 4.09 GBytes 3.52 Gbits/sec [ 15][RX-C] 50.01-60.01 sec 2.45 GBytes 2.10 Gbits/sec [SUM][RX-C] 50.01-60.01 sec 10.6 GBytes 9.15 Gbits/sec - - - - - - - - - - - - - - - - - - - - - - - - - [ ID][Role] Interval Transfer Bitrate Retr [ 5][TX-C] 0.00-60.01 sec 16.0 GBytes 2.30 Gbits/sec 0 sender [ 5][TX-C] 0.00-59.99 sec 16.0 GBytes 2.30 Gbits/sec receiver [ 7][TX-C] 0.00-60.01 sec 33.6 GBytes 4.81 Gbits/sec 0 sender [ 7][TX-C] 0.00-59.99 sec 33.6 GBytes 4.81 Gbits/sec receiver [ 9][TX-C] 0.00-60.01 sec 16.0 GBytes 2.29 Gbits/sec 0 sender [ 9][TX-C] 0.00-59.99 sec 16.0 GBytes 2.29 Gbits/sec receiver [SUM][TX-C] 0.00-60.01 sec 65.7 GBytes 9.40 Gbits/sec 0 sender [SUM][TX-C] 0.00-59.99 sec 65.6 GBytes 9.40 Gbits/sec receiver [ 11][RX-C] 0.00-60.01 sec 24.7 GBytes 3.53 Gbits/sec 22622 sender [ 11][RX-C] 0.00-59.99 sec 24.7 GBytes 3.53 Gbits/sec receiver [ 13][RX-C] 0.00-60.01 sec 24.5 GBytes 3.50 Gbits/sec 20386 sender [ 13][RX-C] 0.00-59.99 sec 24.5 GBytes 3.50 Gbits/sec receiver [ 15][RX-C] 0.00-60.01 sec 14.7 GBytes 2.11 Gbits/sec 13475 sender [ 15][RX-C] 0.00-59.99 sec 14.7 GBytes 2.11 Gbits/sec receiver [SUM][RX-C] 0.00-60.01 sec 63.9 GBytes 9.15 Gbits/sec 56483 sender [SUM][RX-C] 0.00-59.99 sec 63.9 GBytes 9.15 Gbits/sec receiver iperf Done. |
9.40 Gbps uploads and 9.15 Gbps downloads is not too bad. For reference, I also tested bidirectional with two streams: 9.40 Gbps/4.2 Gbps. Four parallel streams further improve the performance:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
jaufranc@CNXSOFT-spacemitk3picoitx:~$ iperf3 -t 60 -c 192.168.4.1 -P 4 -i 10 --bidir Connecting to host 192.168.4.1, port 5201 [ 5] local 192.168.4.133 port 36472 connected to 192.168.4.1 port 5201 [ 7] local 192.168.4.133 port 36476 connected to 192.168.4.1 port 5201 [ 9] local 192.168.4.133 port 36488 connected to 192.168.4.1 port 5201 [ 11] local 192.168.4.133 port 36494 connected to 192.168.4.1 port 5201 [ 13] local 192.168.4.133 port 36500 connected to 192.168.4.1 port 5201 [ 15] local 192.168.4.133 port 36516 connected to 192.168.4.1 port 5201 [ 17] local 192.168.4.133 port 36528 connected to 192.168.4.1 port 5201 [ 19] local 192.168.4.133 port 36538 connected to 192.168.4.1 port 5201 [ ID][Role] Interval Transfer Bitrate Retr Cwnd ... - - - - - - - - - - - - - - - - - - - - - - - - - [ ID][Role] Interval Transfer Bitrate Retr [ 5][TX-C] 0.00-60.00 sec 16.6 GBytes 2.37 Gbits/sec 0 sender [ 5][TX-C] 0.00-59.98 sec 16.6 GBytes 2.37 Gbits/sec receiver [ 7][TX-C] 0.00-60.00 sec 16.4 GBytes 2.34 Gbits/sec 0 sender [ 7][TX-C] 0.00-59.98 sec 16.4 GBytes 2.34 Gbits/sec receiver [ 9][TX-C] 0.00-60.00 sec 16.6 GBytes 2.38 Gbits/sec 0 sender [ 9][TX-C] 0.00-59.98 sec 16.6 GBytes 2.38 Gbits/sec receiver [ 11][TX-C] 0.00-60.00 sec 16.1 GBytes 2.31 Gbits/sec 0 sender [ 11][TX-C] 0.00-59.98 sec 16.1 GBytes 2.31 Gbits/sec receiver [SUM][TX-C] 0.00-60.00 sec 65.6 GBytes 9.40 Gbits/sec 0 sender [SUM][TX-C] 0.00-59.98 sec 65.6 GBytes 9.40 Gbits/sec receiver [ 13][RX-C] 0.00-60.00 sec 23.5 GBytes 3.36 Gbits/sec 17867 sender [ 13][RX-C] 0.00-59.98 sec 23.5 GBytes 3.37 Gbits/sec receiver [ 15][RX-C] 0.00-60.00 sec 17.9 GBytes 2.56 Gbits/sec 17101 sender [ 15][RX-C] 0.00-59.98 sec 17.9 GBytes 2.56 Gbits/sec receiver [ 17][RX-C] 0.00-60.00 sec 12.3 GBytes 1.76 Gbits/sec 11480 sender [ 17][RX-C] 0.00-59.98 sec 12.3 GBytes 1.76 Gbits/sec receiver [ 19][RX-C] 0.00-60.00 sec 11.6 GBytes 1.67 Gbits/sec 10570 sender [ 19][RX-C] 0.00-59.98 sec 11.6 GBytes 1.67 Gbits/sec receiver [SUM][RX-C] 0.00-60.00 sec 65.3 GBytes 9.35 Gbits/sec 57018 sender [SUM][RX-C] 0.00-59.98 sec 65.3 GBytes 9.35 Gbits/sec receiver iperf Done. |
So the SpacemiT K3 can handle 10GbE networking pretty well, but it’s recommended to use multiple cores to achieve optimal performance.
Let’s also test the GbE port:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
jaufranc@CNXSOFT-spacemitk3picoitx:~$ iperf3 -t 60 -c 192.168.31.12 -i 10 --bidir Connecting to host 192.168.31.12, port 5201 [ 5] local 192.168.31.14 port 34974 connected to 192.168.31.12 port 5201 [ 7] local 192.168.31.14 port 34988 connected to 192.168.31.12 port 5201 [ ID][Role] Interval Transfer Bitrate Retr Cwnd [ 5][TX-C] 0.00-10.01 sec 1.09 GBytes 936 Mbits/sec 0 570 KBytes [ 7][RX-C] 0.00-10.01 sec 1.09 GBytes 937 Mbits/sec [ 5][TX-C] 10.01-20.01 sec 1.09 GBytes 934 Mbits/sec 0 856 KBytes [ 7][RX-C] 10.01-20.01 sec 1.09 GBytes 938 Mbits/sec [ 5][TX-C] 20.01-30.01 sec 1.09 GBytes 935 Mbits/sec 0 856 KBytes [ 7][RX-C] 20.01-30.01 sec 1.09 GBytes 938 Mbits/sec [ 5][TX-C] 30.01-40.01 sec 1.09 GBytes 934 Mbits/sec 0 856 KBytes [ 7][RX-C] 30.01-40.01 sec 1.09 GBytes 938 Mbits/sec [ 5][TX-C] 40.01-50.01 sec 1.09 GBytes 934 Mbits/sec 0 856 KBytes [ 7][RX-C] 40.01-50.01 sec 1.09 GBytes 938 Mbits/sec [ 5][TX-C] 50.01-60.01 sec 1.09 GBytes 935 Mbits/sec 0 856 KBytes [ 7][RX-C] 50.01-60.01 sec 1.09 GBytes 938 Mbits/sec - - - - - - - - - - - - - - - - - - - - - - - - - [ ID][Role] Interval Transfer Bitrate Retr [ 5][TX-C] 0.00-60.01 sec 6.53 GBytes 935 Mbits/sec 0 sender [ 5][TX-C] 0.00-60.01 sec 6.53 GBytes 934 Mbits/sec receiver [ 7][RX-C] 0.00-60.01 sec 6.55 GBytes 938 Mbits/sec 1 sender [ 7][RX-C] 0.00-60.01 sec 6.55 GBytes 938 Mbits/sec receiver iperf Done. |
938/935 Mbps for uploads and downloads is good for Gigabit Ethernet.
Let’s now connect the K3 Pico-ITX computer over 5 GHz WiFi 6 using a Xiaomi Router AX6000.
- Download
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
jaufranc@CNXSOFT-spacemitk3picoitx:~$ iperf3 -t 60 -c 192.168.31.12 -i 10 -R Connecting to host 192.168.31.12, port 5201 Reverse mode, remote host 192.168.31.12 is sending [ 5] local 192.168.31.175 port 45902 connected to 192.168.31.12 port 5201 [ ID] Interval Transfer Bitrate [ 5] 0.00-10.01 sec 759 MBytes 636 Mbits/sec [ 5] 10.01-20.01 sec 792 MBytes 665 Mbits/sec [ 5] 20.01-30.01 sec 781 MBytes 655 Mbits/sec [ 5] 30.01-40.01 sec 774 MBytes 649 Mbits/sec [ 5] 40.01-50.00 sec 776 MBytes 652 Mbits/sec [ 5] 50.00-60.01 sec 789 MBytes 661 Mbits/sec - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate Retr [ 5] 0.00-60.02 sec 4.56 GBytes 653 Mbits/sec 30 sender [ 5] 0.00-60.01 sec 4.56 GBytes 653 Mbits/sec receiver iperf Done. |
- Upload
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
jaufranc@CNXSOFT-spacemitk3picoitx:~$ iperf3 -t 60 -c 192.168.31.12 -i 10 Connecting to host 192.168.31.12, port 5201 [ 5] local 192.168.31.175 port 34204 connected to 192.168.31.12 port 5201 [ ID] Interval Transfer Bitrate Retr Cwnd [ 5] 0.00-10.00 sec 810 MBytes 680 Mbits/sec 0 4.01 MBytes [ 5] 10.00-20.01 sec 826 MBytes 692 Mbits/sec 0 4.01 MBytes [ 5] 20.01-30.01 sec 809 MBytes 679 Mbits/sec 2 4.01 MBytes [ 5] 30.01-40.01 sec 796 MBytes 668 Mbits/sec 3 3.41 MBytes [ 5] 40.01-50.01 sec 785 MBytes 658 Mbits/sec 6 3.20 MBytes [ 5] 50.01-60.01 sec 762 MBytes 639 Mbits/sec 7 3.15 MBytes - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate Retr [ 5] 0.00-60.01 sec 4.68 GBytes 670 Mbits/sec 18 sender [ 5] 0.00-60.02 sec 4.68 GBytes 669 Mbits/sec receiver iperf Done. |
653 Mbps downloads and 669 Mbps uploads are quite decent for this system, although Intel/AMD computers can usually handle Gbps WiFi speeds with this setup.
The final wireless test is with Bluetooth. I could pair my Android smartphone with the mini PC without any issue.
I used the connection to transfer a file from the mini PC to the phone, and also played audio from the phone to speakers attached to the mini PC’s audio jack.
SpacemiT K3 AI workloads – Large Language Models.
The SpacemiT K3 SoC features eight RISC-V A100 AI Cores and is said to deliver up to 60 TOPS (INT4) of AI performance, so I had to try some AI workload.
First, I had to install the relevant tools optimized for the K3:
|
1 |
sudo apt install llama.cpp-tools-spacemit |
We can check it’s installed properly by running the client:
|
1 2 3 4 5 6 |
jaufranc@CNXSOFT-spacemitk3picoitx:~$ llama-cli CPU_RISCV64_SPACEMIT: tcm is available, blk_size: 393216, blk_num: 8, is_fake_tcm: 0 CPU_RISCV64_SPACEMIT: num_cores: 16, num_perfer_cores: 8, perfer_core_arch_id: a064, exclude_main_thread: 0, use_ime1: 0, use_ime2: 1, mem_backend: HPAGE, cpu_mask: ff00, aicpu_id_offset: 8 CPU_RISCV64_SPACEMIT: alloc_chunk: open(/dev/tcm_sync_mem) failed, errno=2 CPU_RISCV64_SPACEMIT: failed to allocate init_barrier from shared mem, falling back to heap error: --model is required |
You’ll find a list of models quantized to 4-bit on the SpacemiT website.
The Qwen3‑30B‑A3B and Qwen3‑35B‑A3B look interesting; however, they won’t fit into 16GB of RAM, and you’d need to use the version of the board with 32GB of RAM for these.
Although the best possible model would be LFM2-24B-A2B-Q4_0, it will be tight on 16GB of RAM, so let’s go safe with an 8B parameter model (Qwen3-8B-Q4_K_M.gguf):
|
1 |
<span class="token function">wget</span> https://archive.spacemit.com/spacemit-ai/model_zoo/llm/Qwen3-8B-Q4_K_M.gguf |
We can try the model in the command line (t 8 means we want to use eight cores):
|
1 |
llama-cli -m Qwen3-8B-Q4_K_M.gguf -t 8 -p "Hello, please introduce yourself." |
Here’s the output:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
CPU_RISCV64_SPACEMIT: tcm is available, blk_size: 393216, blk_num: 8, is_fake_tcm: 0 CPU_RISCV64_SPACEMIT: num_cores: 16, num_perfer_cores: 8, perfer_core_arch_id: a064, exclude_main_thread: 0, use_ime1: 0, use_ime2: 1, mem_backend: HPAGE, cpu_mask: ff00, aicpu_id_offset: 8 CPU_RISCV64_SPACEMIT: alloc_chunk: open(/dev/tcm_sync_mem) failed, errno=2 CPU_RISCV64_SPACEMIT: failed to allocate init_barrier from shared mem, falling back to heap Loading model... ▄▄ ▄▄ ██ ██ ██ ██ ▀▀█▄ ███▄███▄ ▀▀█▄ ▄████ ████▄ ████▄ ██ ██ ▄█▀██ ██ ██ ██ ▄█▀██ ██ ██ ██ ██ ██ ██ ██ ▀█▄██ ██ ██ ██ ▀█▄██ ██ ▀████ ████▀ ████▀ ██ ██ ▀▀ ▀▀ build : b1-17ce6aa model : Qwen3-8B-Q4_K_M.gguf modalities : text available commands: /exit or Ctrl+C stop or exit /regen regenerate the last response /clear clear the chat history /read <file> add a text file /glob <pattern> add text files using globbing pattern > Hello, please introduce yourself. [Start thinking] Okay, the user asked me to introduce myself. I need to provide a clear and friendly introduction. Let me start by stating my name, Qwen, and my purpose as an AI assistant. I should mention my ability to handle various tasks like answering questions, creating content, and solving problems. It's important to highlight my training on a large amount of data to ensure accurate and helpful responses. I should also emphasize my commitment to providing safe, reliable, and efficient assistance. I need to keep the tone positive and approachable, inviting the user to ask any questions they might have. Let me make sure the introduction is concise but covers all the key points without being too technical. Also, I should avoid using any markdown and keep the language natural and conversational. [End thinking] Hello! I'm Qwen, a large language model developed by Alibaba Cloud. I'm designed to assist with a wide range of tasks, such as answering questions, creating content, solving problems, and more. My training data covers a vast amount of information, allowing me to provide accurate and helpful responses across various topics. I aim to be a reliable and efficient assistant, always striving to offer safe, thoughtful, and personalized support. Feel free to ask me any questions or share what you need help with—I'm here to assist! 😊 [ Prompt: 19.5 t/s | Generation: 4.3 t/s ] |
Performance is 4.3 tokens per second for generation.
Loading the model occurs on the X100 (Linux) cores, but inference happens on the A100 AI cores.
It’s also possible to run the llama-server to access the LLM chatbot in a web browser.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
jaufranc@CNXSOFT-spacemitk3picoitx:~/LLM$ llama-server -m Qwen3-8B-Q4_K_M.gguf -t 8 --host 127.0.0.1 --port 8080 CPU_RISCV64_SPACEMIT: tcm is available, blk_size: 393216, blk_num: 8, is_fake_tcm: 0 CPU_RISCV64_SPACEMIT: num_cores: 16, num_perfer_cores: 8, perfer_core_arch_id: a064, exclude_main_thread: 0, use_ime1: 0, use_ime2: 1, mem_backend: HPAGE, cpu_mask: ff00, aicpu_id_offset: 8 CPU_RISCV64_SPACEMIT: alloc_chunk: open(/dev/tcm_sync_mem) failed, errno=2 CPU_RISCV64_SPACEMIT: failed to allocate init_barrier from shared mem, falling back to heap 0.00.006.680 I log_info: verbosity = 3 (adjust with the `-lv N` CLI arg) 0.00.006.686 I device_info: 0.00.006.705 I - CPU : Spacemit(R) X100 (15971 MiB, 15971 MiB free) 0.00.006.804 I system_info: n_threads = 8 (n_threads_batch = 8) / 16 | CPU : RISCV_V = 1 | RVV_VLEN = 32 | LLAMAFILE = 1 | OPENMP = 1 | 0.00.006.813 I srv main: n_parallel is set to auto, using n_parallel = 4 and kv_unified = true 0.00.007.074 I srv init: using 15 threads for HTTP server 0.00.007.330 I srv start: binding port with default address family 0.00.008.606 I srv main: loading model 0.00.008.752 I srv load_model: loading model 'Qwen3-8B-Q4_K_M.gguf' 0.00.008.844 I common_init_result: fitting params to device memory ... 0.00.008.849 I common_init_result: (for bugs during this step try to reproduce them with -fit off, or provide --verbose logs if the bug only occurs with -fit on) 0.00.965.965 I common_params_fit_impl: projected to use 6487 MiB of host memory vs. 15971 MiB of total host memory 0.01.498.664 W load: control-looking token: 128247 '</s>' was not control-type; this is probably a bug in the model. its type will be overridden |
With the command line above, we need to use Chromium on the machine itself. It takes quite a lot of resources (12GB+ RAM) since everything runs on the RISC-V computer, even though the X100 application cores handle the web browser, and the A100 AI cores take care of the AI inference.
So I restarted to give access to compute on the LAN instead, using 0.0.0.0 for the host:
|
1 |
jaufranc@CNXSOFT-spacemitk3picoitx:~/LLM$ llama-server -m Qwen3-8B-Q4_K_M.gguf -t 8 --host 0.0.0.0 --port 8080 |
Performance is about the same at 4.7 tokens per second; it just consumes fewer resources on the RISC-V board.
Summary of what works, what doesn’t
So now that testing is basically finished, let’s write a summary showing what works and what doesn’t on the SpacemiT K3 Pico-ITX chassis kit:
- Storage
- 128GB UFS storage – OK, tested up to 853 MB/s read speed, 168 MB/s write speed
- NVMe SSD – Works, but only after changing the system configuration. Performance could be better for a PCIe Gen3 x4 connection (885MB/s read, 167 MB/s write)
- Video and Audio Output
- USB-C
- Video and audio OK through UGREEN dock; tested up to 1920×1080
- Video and audio OK through KTC A32Q8 4K monitor with USB-C PD power; tested up to 3840×2160
- 3.5mm audio jack – OK, tested with external speakers.
- USB-C
- GPU – 3D graphics acceleration enabled, tested with glmark2-es2-wayland and WebGL in Chromium
- VPU – OK in YouTube up to 4K (note: two micro freezes occurred at 4K resolution)
- AI acceleration – OK, tested with 8B LLM (4-bit quantization) at 4.8 tokens/s running on the A100 cores.
- Networking
- Gigabit Ethernet – OK; full-duplex: 902/877 Mbps
- 10Gbps Ethernet – OK; full-duplex up to 9.40/9.45 Gbps; parallel streams required for optimal performance with iperf3
- WiFi 6 – OK, tested at about 660 Mbps DL/UL
- Bluetooth – OK; tested with file transfer and audio playback using an OPPO A98 5G Android smartphone
- USB – USB 3.0 ports tested with an ORICO NVMe SSD enclosure (unless stated otherwise), USB 2.0 ports with a USB HDD (both using an EXT-4 partition), and an RF dongle for a wireless keyboard/mouse combo. Front left to right
- USB 2.0 #1 – 480 Mbps; tested up to 35 MB/s with iozone3
- USB 2.0 #1 – 480 Mbps; tested up to 35 MB/s with iozone3
- USB 2.0 #1 – 480 Mbps; tested up to 35 MB/s with iozone3
- USB 2.0 #1 – 480 Mbps; tested up to 35 MB/s with iozone3
- USB 3.0 Type-C #1 – 5 Gbps; tested up to 352 MB/s (read)
- USB 3.0 Type-C #2 – 5 Gbps; tested through UGREEN dock
- Power input and DP Alt Mode OK.
- ORICO NVMe enclosure – Drive not detected
- Seagate USB 3.0 hard drive – 5,000 Mbps – OK. Speed not tested since the hard drive would be the bottleneck…


Although it’s not perfect, I’m pretty happy with the results. The main issue was to get an NVMe SSD to work with the board. There also seems to be a compatibility issue with at least one SSD enclosure when using the provided UGREEN USB-C dock, and USB ports’ performance could be a little better.
SpacemiT K3 Pico-ITX Chassis Kit’s power consumption
I also checked the power consumption with a wall power meter after removing the NVMe SSD. The first time I measured 13.5 Watts at idle in server mode with just an Ethernet cable connected to the mini PC. It seems a bit too high, but then I remembered I had disabled ASPM for the SSD, so let’s revert the changes and try again:
- Power off – 2.7 Watts!
- Idle
- Server mode
- GbE + WiFi 6 – 13.1 Watts
- 10GbE + WiFi 6 – 17.0 – 17.1 Watts
- GbE + 10 GbE + WiFi 6 – 17.3 – 17.5 Watts
- Desktop mode
- GbE + WiFi 6 + UGREEN dock + HDMI + RF dongle – 13.6 – 13.8 Watts
- 10GbE + WiFi 6 + UGREEN dock + HDMI + RF dongle – 18.0 – 18.2 Watts
- Server mode
- YouTube 4K in Chromium – 17.1 – 19.0 Watts
- Stress-ng
- 8-core X100 – 22.1 – 22.6 Watts
- 16-core (X100 + A100) – 25.2 – 25.3 Watts; note: fan gets noisier
Reverting the boot arguments didn’t help much. The SpacemiT K3 consumes a bit more power than some people may be comfortable with. The power-off consumption at up to 3 Watts may even be illegal in some countries… The good news is the relatively low power consumption when playing a 4K YouTube video thanks to hardware video decode.
For reference, unless otherwise stated, all tests were done in “Desktop mode” with GbE, UGREEN dock, HDMI, and RF dongle.
Conclusion
Overall, I was pleasantly surprised by the SpacemiT K3 Pico-ITX Chassis Kit, as it looks like a standard mini PC and many people could even consider it as a low-end computer to browse the web, watch videos, and check emails. Almost everything works as advertised, including 3D graphics acceleration, hardware video decoding in YouTube up to 4Kp60 resolution, and accelerated AI/LLM workloads. UFS storage provides excellent performance, 10GbE networking works well, although you’d need to use multi-core to achieve the full throughput, and I didn’t encounter any issues with the GbE port, WiFi 6 (660 Mbps upload/download), or Bluetooth connectivity.
That’s not to say I didn’t have issues. First, I struggled to have an M.2 NVMe SSD work reliably, and I had to change boot parameters. Once fixed, the performance of the SSD over a PCIe Gen3 x4 SSD was disappointing. I also had interoperability troubles using one NVMe SSD enclosure through the USB-C PD port that was not recognized at all, and the actual throughput of all USB ports is a bit lower than expected. I also wish there were an HDMI port or a second USB-C port with DP Alt Mode, as the mini PC requires a USB-C dock to connect a display and power, except for people owning a monitor with USB-PD output to power the mini PC. Finally, the power consumption of the system is rather high at idle.
I’d like to thank SpacemiT for sending the K3 Pico-ITX Chassis Kit for review. The company told me this exact kit might become available in August. If you don’t care about this specific enclosure, SpacemiT relies on a range of distributors such as Banana Pi and Sipeed for the K3 Pico-ITX SBC ($479 for the 16GB/128GB model). The closest option to the “Chassis Kit” is the Milk-V Jupiter 2 with a Pico-ITX chassis using two external antennas. It sells for $380 for the 16GB RAM/128GB UFS model.

Jean-Luc started CNX Software in 2010 as a part-time endeavor, before quitting his job as a software engineering manager, and starting to write daily news, and reviews full time later in 2011.
Support CNX Software! Donate via cryptocurrencies, become a Patron on Patreon, or purchase goods on Amazon or Aliexpress. We also use affiliate links in articles to earn commissions if you make a purchase after clicking on those links.























