"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيف يمكن تحسين وظيفة __mm_add_epi32_inplace_purego باستخدام تعليمات التجميع للحصول على أداء أفضل في عمليات عد السكان الموضعية؟

كيف يمكن تحسين وظيفة __mm_add_epi32_inplace_purego باستخدام تعليمات التجميع للحصول على أداء أفضل في عمليات عد السكان الموضعية؟

تم النشر بتاريخ 2024-11-06
تصفح:552

How can the __mm_add_epi32_inplace_purego function be optimized using assembly instructions for better performance in positional population counting operations?

تحسين __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