#define Size 819000
int sieve ( int N ) {
int64_t i , k , prime , count , n ; char flags [ Size ];
for ( n = 0 ; n < N ; n ++ ) {
count = 0 ;
for ( i = 0 ; i < Size ; i ++ )
flags [ i ] = 1 ;
for ( i = 0 ; i < Size ; i ++ )
if ( flags [ i ]) {
prime = i + i + 3 ;
for ( k = i + prime ; k < Size ; k += prime )
flags [ k ] = 0 ;
count ++ ;
}
}
return count ;
}
void ex100 ( void ) {
printf ("sieve (100) = %d", sieve (100));
}
m_sieve : module
export sieve
sieve : func i32, i32:N
local i64:iter, i64:count, i64:i, i64:k, i64:prime, i64:temp, i64:flags
alloca flags, 819000
mov iter, 0
loop : bge fin, iter, N
mov count, 0; mov i, 0
loop2 : bge fin2, i, 819000
mov u8:(flags, i), 1; add i, i, 1
jmp loop2
fin2 : mov i, 0
loop3 : bge fin3, i, 819000
beq cont3, u8:(flags,i), 0
add temp, i, i; add prime, temp, 3; add k, i, prime
loop4 : bge fin4, k, 819000
mov u8:(flags, k), 0; add k, k, prime
jmp loop4
fin4 : add count, count, 1
cont3 : add i, i, 1
jmp loop3
fin3 : add iter, iter, 1
jmp loop
fin : ret count
endfunc
endmodule
m_ex100 : module
format : string "sieve (10) = %dn"
p_printf : proto p:fmt, i32:result
p_sieve : proto i32, i32:iter
export ex100
import sieve, printf
ex100 : func v, 0
local i64:r
call p_sieve, sieve, r, 100
call p_printf, printf, format, r
endfunc
endmodule
func
توقيع الوظيفة (أخذ وسيطة عدد صحيح موقّع 32 بت وإرجاع قيمة عدد صحيح موقّع 32 بت) ووسيطة الوظيفة N
التي ستكون متغيرًا محليًا من نوع عدد صحيح موقّع 64 بت;
string
البيانات في شكل سلسلة Cexport
وظائف الوحدة أو البيانات المرئية خارج الوحدة الحاليةimport
وظائف الوحدة أو البيانات التي يجب تعريفها في وحدات MIR الأخرىproto
النماذج الأولية للوظيفة. بناء الجملة الخاص به هو نفس بناء جملة func
call
هي تعليمات MIR لاستدعاء الوظائف MIR_load_external
m1
و m2
عبارة عن وحدات m_sieve
و m_e100
، func
هي دالة ex100
، sieve
هي sieve
دالة ): /* ctx is a context created by MIR_init / MIR_init2 */
MIR_load_module ( ctx , m1 ); MIR_load_module ( ctx , m2 );
MIR_load_external ( ctx , "printf" , printf );
MIR_link ( ctx , MIR_set_interp_interface , import_resolver );
/* or use MIR_set_gen_interface to generate and use the machine code */
/* or use MIR_set_lazy_gen_interface to generate function code on its 1st call */
/* use MIR_gen (ctx, func) to explicitly generate the function machine code */
MIR_interp ( ctx , func , & result , 0 ); /* zero here is arguments number */
/* or ((void (*) (void)) func->addr) (); to call interpr. or gen. code through the interface */
binfmt_misc
تم إعداد الملف الثنائي mir-bin-run
للاستخدام من binfmt_misc
بالسطر التالي (مثال):
line=:mir:M::MIR::/usr/local/bin/mir-bin-run:P
echo $line > /proc/sys/fs/binfmt_misc/register
قم بتكييف المسار الثنائي mir-bin-run مع نظامك، فهذا هو المسار الافتراضي
والتشغيل مع
c2m your-file.c -o your-file
chmod +x your-file
./your-file your args
الملف القابل للتنفيذ "قابل للتكوين" مع متغيرات البيئة:
MIR_TYPE
بتعيين الواجهة لتنفيذ التعليمات البرمجية: interp
(للتفسير)، jit
(للإنشاء)، و lazy
(للإنشاء البطيء، افتراضيًا)؛MIR_LIBS
(قائمة مفصولة بنقطتين) قائمة بالمكتبات الإضافية المراد تحميلها؛MIR_LIB_DIRS
أو LD_LIBRARY_PATH
(قائمة مفصولة بنقطتين) قائمة إضافية من الدلائل للبحث في المكتبات.نظرًا للطبيعة المرتبطة لـ
mir-bin-run
معbinfmt_misc
، قد يكون من الغريب بعض الشيء الاتصالmir-bin-run
مباشرةً. تقوم العلامةP
الموجودة على binfmt_misc بتمرير وسيطة إضافية بالمسار الكامل إلى ثنائي MIR.
خط أنابيب تحسين قصير جدًا للسرعة وخفة الوزن
الاستخدام الأمثل الأكثر قيمة فقط:
مستويات تحسين مختلفة لضبط سرعة الترجمة مقابل أداء التعليمات البرمجية التي تم إنشاؤها
يتم استخدام نموذج SSA من MIR قبل تخصيص السجل
بساطة تنفيذ التحسينات على الأداء الفائق للكود الذي تم إنشاؤه
مزيد من التفاصيل حول خط أنابيب مترجم JIT الكامل :
تبسيط : خفض MIR
مضمن : تضمين مكالمات MIR
بناء CFG : الرسم البياني لتدفق التحكم في البناء (الكتل الأساسية وحواف CFG)
بناء SSA : بناء نموذج تخصيص ثابت واحد عن طريق إضافة عقد phi وحواف SSA إلى المعاملات
تحويل العنوان : إزالة أو تغيير تعليمات MIR ADDR
ترقيم القيمة العالمية : إزالة insns الزائدة من خلال GVN. يتضمن ذلك النشر المستمر وإزالة الأحمال الزائدة
نشر النسخ : نشر نسخ SSA وإزالة تعليمات الامتداد الزائدة عن الحاجة
إزالة المتجر الميت : إزالة المتاجر الزائدة عن الحاجة
إزالة الكود الميت : إزالة insns مع المخرجات غير المستخدمة
تخفيف الضغط : نقل النزل لتقليل ضغط التسجيل
دمج SSA : دمج العناوين ومقارنة أزواج التعليمات الفرعية
خارج SSA : إزالة عقد phi وحواف SSA
خيارات القفز : تحسينات القفز المختلفة
التصنيع : تشغيل التعليمات البرمجية المعتمدة على الآلة لتحويل MIR لمكالمات ABI وinsns ثنائية العمليات وما إلى ذلك
البحث عن الحلقات : العثور على الحلقات الطبيعية وبناء شجرة الحلقات
بناء معلومات حية : حساب العيش والعيش خارج الكتل الأساسية
بناء صراعات التسجيل : بناء مصفوفة الصراع للسجلات المشاركة في التحركات. يتم استخدامه لتسجيل الاندماج
التحام : اندماج السجل العدواني
مُخصص التسجيل (RA) : المسح الخطي على أساس الأولوية RA مع تقسيم النطاق المباشر
بناء النطاقات الحية : حساب نطاقات نقاط البرنامج للسجلات
تعيين : RA سريع لـ -O0
أو مسح خطي قائم على الأولوية RA لـ -O1
وما فوق
إعادة الكتابة : قم بتحويل MIR وفقًا للتخصيص باستخدام التسجيلات الثابتة المحجوزة
الجمع (اختيار الكود): دمج insns المعتمدة على البيانات في واحد
إزالة الكود الميت : إزالة insns مع المخرجات غير المستخدمة
إنشاء Insns للجهاز : تشغيل التعليمات البرمجية المعتمدة على الجهاز لإنشاء Insns للجهاز
c2m
. راجع README.mdmir.h
و mir.c
على كود API الرئيسي بما في ذلك الإدخال/الإخراج لتمثيل النص الثنائي MIR وMIRmir-dlist.h
و mir-mp.h
و mir-varr.h
و mir-bitmap.h
و mir-hash.h
و mir-htab.h
و mir-reduce.h
على تعليمات برمجية عامة تتوافق مع الارتباط المزدوج القوائم، وتجمعات الذاكرة، والمصفوفات ذات الطول المتغير، والصور النقطية، وحسابات التجزئة، وجداول التجزئة، وضغط/فك ضغط البيانات. الملف mir-hash.h
عبارة عن دالة تجزئة عامة وبسيطة وعالية الجودة تستخدمها جداول التجزئةmir-interp.c
على كود لتفسير كود MIR. تم تضمينه في mir.c
ولم يتم تجميعه بشكل منفصلmir-gen.h
و mir-gen.c
و mir-gen-x86_64.c
و mir-gen-aarch64.c
و mir-gen-ppc64.c
و mir-gen-s390x.c
و mir-gen-riscv64.c
يحتوي mir-gen-riscv64.c
على رمز لبرنامج التحويل البرمجي MIR JITmir-gen-x86_64.c
و mir-gen-aarch64.c
و mir-gen-ppc64.c
و mir-gen-s390x.c
و mir-gen-riscv64.c
هي تعليمات برمجية تعتمد على الآلة لمترجم JITmir-.c
على تعليمات برمجية بسيطة تعتمد على الآلة وهي شائعة للمترجم الفوري ومترجم JITmir-.h
على إعلانات شائعة للمترجم الفوري ومترجم JITmir2c/mir2c.h
و mir2c/mir2c.c
على رمز لبرنامج التحويل البرمجي من MIR إلى C. قد لا يكون الكود الذي تم إنشاؤه محمولاًc2mir/c2mir.h
و c2mir/c2mir.c
و c2mir/c2mir-driver.c
و c2mir/mirc.h
على تعليمات برمجية لمترجم C إلى MIR. تحتوي الملفات الموجودة في المجلدات c2mir/x86_64
و c2mir/aarch64
و c2mir/ppc64
و c2mir/s390x
و c2mir/riscv64
على الكود المعتمد على الآلة x86_64 و aarch64 و ppc64le و s390x و riscv لمترجم C إلى MIRmir-bin-run.c
على رمز mir-bin-run
الموصوف أعلاهmir-bin-driver.c
مع الأداة المساعدة b2ctab
كطريقة محمولة لإنشاء ملفات ثنائية من ملفات MIR الثنائيةmir-utils
على أدوات مساعدة مختلفة للعمل مع MIR، على سبيل المثال تحويل MIR الثنائي إلى MIR نصي والعكسadt-tests
، mir-tests
، c-tests
، و c-benchmarks
على تعليمات برمجية للاختبار وقياس الأداء MIR و c2m
make bench
make test
Intel i5-13600K بذاكرة 64 جيجابايت تحت FC37 مع مجلس التعاون الخليجي 12.3.1
مولد مير | مترجم مير | دول مجلس التعاون الخليجي -O2 | دول مجلس التعاون الخليجي -O0 | |
---|---|---|---|---|
التجميع [1] | 1.0 (249us) | 0.09 (22us) | 109 (27.1 مللي ثانية) | 105 (26.1 مللي ثانية) |
التنفيذ [2] | 1.0 (1.74 ث) | 13.7 (23.8 ث) | 0.92 (1.6 ثانية) | 2.28 (3.97 ث) |
حجم الكود [3] | 1.0 (557 كيلو بايت) | 0.43 (240 كيلو بايت) | 58 (32.2 ميجابايت) | 58 (32.2 ميجابايت) |
لوك [4] | 1.0 (23.4 كيلو) | 0.48 (11.3 كيلو) | 103 (2420 ألف) | 103 (2402 كيلو) |
[1] يعتمد على وقت تجميع كود المنخل C (بدون أي ملف متضمن ومع استخدام نظام ملفات الذاكرة لدول مجلس التعاون الخليجي) ورمز المنخل MIR المقابل بواسطة مترجم MIR ومولد MIR مع مستوى التحسين 2
[2] يعتمد على أفضل وقت جداري يبلغ 10 عمليات تشغيل مع مستوى تحسين مولد MIR المستخدم 2
[3] يعتمد على أحجام مجردة من cc1 لنواة دول مجلس التعاون الخليجي وMIR والمترجم الفوري أو المولد لـ MIR
[4] يعتمد تقديري فقط على الملفات المطلوبة لمترجم GNU C x86-64 وملفات MIR للحد الأدنى من البرامج لإنشاء كود MIR وتشغيله
Intel i5-13600K بذاكرة 64 جيجابايت تحت FC37 مع مجلس التعاون الخليجي 12.3.1
c2m -O2 -eg (مولد) | c2m -ei (مترجم) | دول مجلس التعاون الخليجي -O2 | دول مجلس التعاون الخليجي -O0 | |
---|---|---|---|---|
التجميع [1] | 1.0 (336us) | 1.0 (337us) | 80 (27.1 مللي ثانية) | 77 (26.1 مللي ثانية) |
التنفيذ [2] | 1.0 (1.74 ث) | 13.7 (23.8 ث) | 0.92 (1.6 ثانية) | 2.28 (3.97 ث) |
حجم الكود [3] | 1.0 (961 كيلو بايت) | 1.0 (961 كيلو بايت) | 34 (32.2 ميجابايت) | 34 (32.2 ميجابايت) |
لوك [4] | 1.0 (54.8 كيلو) | 1.0 (54.8 كيلو) | 44 (2420 ألف) | 44 (2420 ألف) |
[1] يعتمد على وقت تجميع كود المنخل C (بدون أي ملف تضمين ومع استخدام نظام ملفات الذاكرة لدول مجلس التعاون الخليجي)
[2] يعتمد على أفضل وقت جداري يبلغ 10 عمليات تشغيل مع مستوى تحسين مولد MIR المستخدم 2
[3] يعتمد على أحجام مجردة من cc1 لـGC وC2MIR ونواة MIR ومترجم ومولد لـ MIR
[4] يعتمد على جميع الملفات المصدر باستثناء الاختبارات
يتم هنا إنشاء أداء التعليمات البرمجية المتعلق بـGC -O2 لمترجمات C المختلفة على 15 معيارًا صغيرًا لـ C (من الدليل c-benchmarks
) على نفس الجهاز حيث
متوسط | جيوميان | |
---|---|---|
دول مجلس التعاون الخليجي -O2 | 1.00 | 1.00 |
دول مجلس التعاون الخليجي -O0 | 0.63 | 0.57 |
c2m -على سبيل المثال | 0.96 | 0.91 |
c2m -eb | 0.92 | 0.85 |
chibicc | 0.38 | 0.30 |
رنة -O2 | 1.12 | 1.09 |
محلل -O3 | 1.02 | 0.98 |
com.cproc | 0.68 | 0.65 |
لاك -O3 | 0.47 | 0.39 |
بي سي سي -O | 0.80 | 0.78 |
tcc | 0.54 | 0.50 |
emcc -O2/واسمر | 0.60 | 0.55 |
رافعة واسي -O2/واسمر | 0.60 | 0.54 |
واسي -O2/واسمر LLVM | 0.78 | 0.72 |
Wasi -O2/Wasmer Singlepass | 0.45 | 0.36 |
واسي -O2/wasmtime | 0.92 | 0.87 |
c2m
) إلى هدف آخر لمدة شهر أو شهرين