हमारे एम्बेडेड आर्किटेक्चर में हमारे पास 64-बिट आईएबी (निर्देश संरेखण बफर) है। Fetch अनुक्रम को अनुकूलित करने के लिए, यह आवश्यक है कि एक लूप का शरीर 8-बाइट सीमा से गठबंधन शुरू हो जाएगा।सी फॉर-लूप बॉडी डब्ल्यू/जीसीसी को संरेखित कैसे करें?
.balign
निर्देश का उपयोग करके असेंबली में इसे हासिल करना आसान है, लेकिन मुझे एक वाक्यविन्यास नहीं मिल रहा है जो कोड को संरेखित करने के लिए सी कंपाइलर को संकेत देगा।
.balign
निर्देश के साथ इनलाइन असेंबली के साथ लूप के लिए पहले से प्रयास करने का प्रयास नहीं करता है क्योंकि यह लूप प्रोलॉग (सेटअप) के लिए संरेखित करता है और लूप बॉडी नहीं।
वही करना जहां asm()
लाइन लूप के अंदर है, nop
-लूप बॉडी को मूल्यवान चक्रों की लागत में जोड़ता है।
संपादित करें 1: कोड मान:
__asm__ volatile("nop");
__asm__ volatile("nop");
for (j0=0; j0<N; j0+=4)
{
c[j0+ 0] = a[j0+ 0] + b[j0+ 0];
c[j0+ 1] = a[j0+ 1] + b[j0+ 1];
c[j0+ 2] = a[j0+ 2] + b[j0+ 2];
c[j0+ 3] = a[j0+ 3] + b[j0+ 3];
}
मैं पहली बार c=a+b
एक 8 बाइट का पता करने के लिए गठबंधन किया जाना चाहते हैं। मैं nop
को प्रारंभिक संकलन के बाद उपरोक्त की तरह जोड़ सकता हूं, लेकिन यह एक विज्ञापन-समाधान समाधान है जो 1 कोड परिवर्तन के साथ टूट जाएगा।
संपादित 2: @R .. के लिए धन्यवाद, समाधान -falign-loops=8
संकलक विकल्प का उपयोग करना है।
तो संक्षेप में, आप 'nop'-s चाहते हैं जो लूप * बॉडी * को गठबंधन कर देगा, लेकिन आप लूप * prolog * से पहले उन' nop' s को जाना चाहते हैं? – ruakh
@ruakh - हाँ, हालांकि मुझे परवाह नहीं है कि 'nop's prolog में ही उत्पन्न होते हैं, जब तक लूप के अंत में शाखा निर्देश एक गठबंधन स्मृति स्थान पर इंगित करता है। – ysap
समझा। यह एक बड़ा सवाल है! – ruakh