تحسين __mm_add_epi32_inplace_purego باستخدام التجميع
يسعى هذا السؤال إلى تحسين الحلقة الداخلية لوظيفة __mm_add_epi32_inplace_purego، التي تقوم بإجراء عدد السكان الموضعي على مجموعة من البايتات. الهدف هو تحسين الأداء من خلال استخدام تعليمات التجميع.
تطبيق Go الأصلي للحلقة الداخلية:
__mm_add_epi32_inplace_purego(&counts[i],توسيع)
__mm_add_epi32_inplace_purego(&counts[i], expand)قد يكون استخدام '&counts[i]' لتمرير عنوان عنصر المصفوفة غير فعال. لتحسين ذلك، يمكننا تمرير المؤشر إلى المصفوفة بأكملها بدلاً من ذلك:__mm_add_epi32_inplace_inplace_purego(counts,توسع)
__mm_add_epi32_inplace_purego(&counts[i], expand)يقلل هذا التعديل الحمل المرتبط بتمرير المصفوفات كوسيطات.بالإضافة إلى ذلك، يمكن تحسين الحلقة الداخلية بشكل أكبر باستخدام تعليمات التجميع. رمز التجميع التالي هو إصدار من __mm_add_epi32_inplace_purego تم تنفيذه في التجميع:// func __mm_add_epi32_inplace_asm(counts *[8]int32, توسيع *[8]int32) النص ·__mm_add_epi32_inplace_asm(SB)،NOSPLIT،$0-16 عدد MOVQ هو 0(FP)، DI MOVQ توسيع 8 (FP)، SI MOVL 8*0(DI)، AX // عدد التحميل[0] ADDL 8*0(SI)، AX // إضافة توسيع[0] MOVL AX, 8*0(DI) // نتيجة المتجر في الأعداد[0] MOVL 8*1(DI)، AX // عدد التحميل[1] ADDL 8*1(SI)، AX // إضافة توسيع[1] MOVL AX, 8*1(DI) // نتيجة تخزين الأعداد[1] MOVL 8*2(DI)، AX // عدد التحميل[2] ADDL 8*2(SI)، AX // إضافة توسيع[2] MOVL AX, 8*2(DI) // نتيجة تخزين الأعداد[2] MOVL 8*3(DI)، AX // عدد الأحمال[3] ADDL 8*3(SI)، AX // إضافة توسيع[3] MOVL AX, 8*3(DI) // نتيجة تخزين الأعداد[3] MOVL 8*4(DI)، AX // عدد الأحمال[4] ADDL 8*4(SI)، AX // إضافة توسيع[4] MOVL AX، 8*4(DI) // نتيجة المتجر في الأعداد[4] MOVL 8*5(DI)، AX // عدد الأحمال[5] ADDL 8*5(SI)، AX // إضافة توسيع[5] MOVL AX، 8*5(DI) // نتيجة المتجر في الأعداد[5] MOVL 8*6(DI)، AX // عدد الأحمال[6] ADDL 8*6(SI)، AX // إضافة توسيع[6] MOVL AX، 8*6(DI) // نتيجة المتجر في الأعداد[6] MOVL 8*7(DI)، AX // عدد التحميل[7] ADDL 8*7(SI)، AX // إضافة توسيع[7] MOVL AX, 8*7(DI) // نتيجة تخزين الأعداد[7] RET
// func __mm_add_epi32_inplace_asm(counts *[8]int32, expand *[8]int32) TEXT ·__mm_add_epi32_inplace_asm(SB),NOSPLIT,$0-16 MOVQ counts 0(FP), DI MOVQ expand 8(FP), SI MOVL 8*0(DI), AX // load counts[0] ADDL 8*0(SI), AX // add expand[0] MOVL AX, 8*0(DI) // store result in counts[0] MOVL 8*1(DI), AX // load counts[1] ADDL 8*1(SI), AX // add expand[1] MOVL AX, 8*1(DI) // store result in counts[1] MOVL 8*2(DI), AX // load counts[2] ADDL 8*2(SI), AX // add expand[2] MOVL AX, 8*2(DI) // store result in counts[2] MOVL 8*3(DI), AX // load counts[3] ADDL 8*3(SI), AX // add expand[3] MOVL AX, 8*3(DI) // store result in counts[3] MOVL 8*4(DI), AX // load counts[4] ADDL 8*4(SI), AX // add expand[4] MOVL AX, 8*4(DI) // store result in counts[4] MOVL 8*5(DI), AX // load counts[5] ADDL 8*5(SI), AX // add expand[5] MOVL AX, 8*5(DI) // store result in counts[5] MOVL 8*6(DI), AX // load counts[6] ADDL 8*6(SI), AX // add expand[6] MOVL AX, 8*6(DI) // store result in counts[6] MOVL 8*7(DI), AX // load counts[7] ADDL 8*7(SI), AX // add expand[7] MOVL AX, 8*7(DI) // store result in counts[7] RETيقوم رمز التجميع هذا بتحميل عناصر "الأعداد" و"التوسيع" في السجلات، وتنفيذ عملية الإضافة، وتخزين النتيجة مرة أخرى في "الأعداد". من خلال تجنب الحاجة إلى تمرير المصفوفات كوسيطات وباستخدام تعليمات التجميع الفعالة، يعمل هذا الرمز على تحسين أداء الحلقة الداخلية بشكل ملحوظ.باختصار، عن طريق تمرير المؤشر إلى المصفوفة بدلاً من عنوان العنصر ومن خلال تنفيذ الحلقة الداخلية في التجميع، يمكن تحسين وظيفة __mm_add_epi32_inplace_purego لتحقيق أداء محسن في عمليات عد السكان الموضعية.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3