در دنیای امروز، جایی که وابستگی به معماریهای x86 و ARM غالب است، پردازندههای بومی چینی مثل Loongson 3A6000 میتوانند یک انقلاب کوچک باشند. این پردازنده، که بر پایه معماری اختصاصی LoongArch ساخته شده، تلاشی جدی از سوی شرکت Loongson برای کاهش وابستگی چین به فناوریهای خارجی است. اخیراً، با دسترسی به یک سیستم مجهز به این پردازنده از طریق جامعه هواداران Loongson، فرصتی دست داد تا عملکرد آن را در بنچمارکهای واقعی بسنجم.
Loongson 3A6000 با فرکانس پایه ۲.۵ گیگاهرتز، از دو نسل گسترش SIMD (دستورات برداری موازی) پشتیبانی میکند: LSX (۱۲۸ بیتی، مشابه SSE در x86 یا NEON در ARM) و LASX (۲۵۶ بیتی، مشابه AVX/AVX2 در x86). اما چالش اصلی؟ اکوسیستم نرمافزاری محدود. بر روی لینوکس (مثل Debian) اجرا میشود، اما ابزارهایی مثل neovim یا Visual Studio Code هنوز باینریهای آمادهی آنرا ندارند، و حتی اتصال SSH به سیستمهای LoongArch گاهی دردسرساز است. با این حال، کامپایلرهایی مثل GCC و LLVM از LoongArch پشتیبانی میکنند. در این مقاله، نتایج بنچمارکهای من را با یک پردازنده Intel Xeon Gold 6338 (از نسل Ice Lake با فرکانس ۳.۱۹ گیگاهرتز) مقایسه میکنم. توجه کنید که این مقایسه کاملاً عادلانه نیست – کدهای ما بیشتر برای x86 بهینه شدهاند – اما نگاهی واقعی به پتانسیل Loongson میدهد.
توضیحات و بنچمارکها
برای ارزیابی عملکرد، دو نوع بنچمارک انتخاب کردم: تجزیه اعداد (number parsing) و تبدیل کدگذاری رشتهها (string transcoding). اینها وظایفی هستند که در توسعه نرمافزارهای پرسرعت، مثل پردازش دادههای بزرگ یا سرورها، بسیار رایجاند. هر دو بنچمارک از کتابخانههای منبعباز استفاده میکنند و با GCC ۱۵ کامپایل شدهاند. برای اجرای آنها، sudo لازم است تا شمارندههای عملکرد (perf counters) فعال شوند – چیزی که توسعهدهندگان سیستم حتماً با آن آشنا هستند.
بنچمارک تجزیه اعداد
این بنچمارک بر پایه کتابخانه simple_fastfloat_benchmark است (از GitHub: lemire/simple_fastfloat_benchmark). هدف، اندازهگیری سرعت تبدیل رشتههای عددی به float است – مثلاً در پردازش JSON یا CSV. دو پیادهسازی تست شد: fast_float (سریع و ساده) و تجزیهگر Abseil گوگل.
برای راهاندازی:
git clone https://github.com/lemire/simple_fastfloat_benchmark.git
cd simple_fastfloat_benchmark
cmake -B build
cmake --build build
sudo ./build/benchmarks/benchmark
نتایج را در جدول زیر ببینید (تعداد دستورات به ازای هر float، دستورات به ازای هر سیکل – IPC – و فرکانس):
| پردازنده | دستورات به ازای float | IPC (دستورات به ازای سیکل) | فرکانس (GHz) |
| Loongson 3A6000 | ۳۷۷ | ۴.۹۲ | ۲.۵۰ |
| Intel Xeon Gold 6338 | ۲۹۵ | ۵.۰۷ | ۳.۱۹ |
تحلیل برای fast_float: دستورات Loongson IPC مشابهی دارد، اما تعداد دستورات بالاتر و فرکانس پایینتر باعث میشود Intel حدود ۲۰-۳۰٪ سریعتر باشد. این نشاندهنده کارایی خوب معماری LoongArch در وظایف اسکالر است، اما بهینهسازیهای SIMD هنوز جا برای پیشرفت دارد.
برای Abseil: اینجا حاشیه برتری Intel کمتر است (کمتر از ۱۵٪). تعداد دستورات تقریباً برابر است، که حاکی از پتانسیل Loongson در کتابخانههای عمومی است. نکته: توسعهدهندگان میتوانند با استفاده از intrinsics LSX، الگوریتمهای تجزیه را سفارشی کنند – مثلاً با تمرکز روی عملیات برداری برای اعداد ممیز شناور. این کار میتواند شکاف فرکانسی را جبران کند، چون LSX اجازه پردازش موازی ۴ float ۳۲ بیتی را میدهد.
بنچمارک تبدیل کدگذاری رشتهها
این بخش SIMD-محور است و از کتابخانه simdutf (GitHub: simdutf/simdutf) برای تبدیل UTF-8 به UTF-16LE استفاده میکند – مثلاً برای پردازش متنهای وب. فایل README.md به عنوان ورودی تست شد.
راهاندازی:
git clone https://github.com/simdutf/simdutf.git
cd simdutf
cmake -B build -D SIMDUTF_BENCHMARKS=ON
cmake --build build --target benchmark
sudo ./build/benchmarks/benchmark -P utf8_to_utf16le -F README.md
نتایج (دستورات به ازای هر بایت، IPC و فرکانس):
| پردازنده | دستورات به ازای بایت | IPC | فرکانس (GHz) |
| Loongson 3A6000 (LSX) | ۰.۵۶۲ | ۲.۶۳۳ | ۲.۵۰ |
| Loongson 3A6000 (LASX) | ۰.۳۹۰ | ۱.۵۴۹ | ۲.۵۰ |
| Intel Xeon Gold 6338 (SSSE3) | ۰.۶۱۷ | ۵.۰۷ | ۳.۲۳۶ |
| Intel Xeon Gold 6338 (AVX2) | ۰.۳۶۴ | ۲.۶۲۵ | ۳.۱۹ |
| Intel Xeon Gold 6338 (AVX-512) | ۰.۲۷۱ | ۱.۶۵۷ | ۳.۱۲۷ |
تحلیل: LASX (۲۵۶ بیتی) در Loongson عملکرد بهتری نسبت به LSX نشان میدهد – حدود ۳۰٪ کاهش در دستورات به ازای بایت. این با AVX2 در Intel همخوانی دارد، اما IPC پایینتر Loongson (۱.۵۴۹ vs. ۲.۶۲۵) و فرکانس کمتر، throughput را به حدود ۱۰ گیگابایت بر ثانیه میرساند (در مقابل ۲۰ گیگابایت در Intel برای فایلهای ASCII). نکته جالب: وقتی با -march=native کامپایل میکنم، LASX همیشه فعال نمیشود و گاهی LSX سریعتر است – احتمالاً به خاطر مشکلات بهینهسازی کامپایلر.
LoongArch مستقل از x86 است، اما دستورات SIMD آن (LSX/LASX) از نظر مفهومی مشابه هستند، پس پورت کردن کد x86 با intrinsics نسبتاً آسان است. مثلاً، یک تابع ساده برای جمع برداری در LSX:
#include <lsxintrin.h>
void vector_add(float* a, float* b, float* result, int n) {
for (int i = 0; i < n; i += 4) {
__m128 sum = __lsx_fadd_s(a[i], b[i]); // جمع ۴ float
__lsx_st_w(sum, result + i, 0); // ذخیره
}
}این کد ساده و خوانا است و نشان میدهد چقدر LoongArch به ARM نزدیک است. اگر توسعهدهنده هستید، پیشنهاد میکنم runtime dispatching اضافه کنید (مثل CPUID در x86) برای سوئیچ خودکار بین LSX و LASX – GCC از __builtin_cpu_supports("lasx") پشتیبانی میکند، اما تستهای بیشتری لازم است. همچنین، در مقایسه با AMD EPYC (بر اساس بررسی Chips and Cheese)، Loongson بین Zen 1 و Zen 2 قرار میگیرد – یعنی برای سرورهای میانرده یا حتی گیمینگ (مثل PS5 بر پایه Zen 2) مناسب است، اما برای کارهای سنگین AI، AVX-512 Intel هنوز برتری دارد.
نتیجهگیری
در نهایت، Loongson 3A6000 یک موفقیت مهندسی واقعی است – IPC رقابتی، پشتیبانی SIMD قوی، و عملکردی که در وظایف واقعی مثل تجزیه داده یا پردازش متن، با پردازندههای قدیمیتر Intel همپا میشود. با وجود چالشهایی مثل فرکانس پایینتر و اکوسیستم نرمافزاری ناقص، این پردازنده نشان میدهد چین در حال ساختن جایگزینهای بومی قدرتمند است. برای ما توسعهدهندگان، این یعنی فرصتهایی برای بهینهسازی: از پورت کتابخانهها با intrinsics LSX/LASX گرفته تا توسعه ابزارهای تشخیص runtime. مهندسان Loongson حق دارند افتخار کنند.