2012-03-26 10 views
12

हमारे एम्बेडेड आर्किटेक्चर में हमारे पास 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 संकलक विकल्प का उपयोग करना है।

+0

तो संक्षेप में, आप 'nop'-s चाहते हैं जो लूप * बॉडी * को गठबंधन कर देगा, लेकिन आप लूप * prolog * से पहले उन' nop' s को जाना चाहते हैं? – ruakh

+0

@ruakh - हाँ, हालांकि मुझे परवाह नहीं है कि 'nop's prolog में ही उत्पन्न होते हैं, जब तक लूप के अंत में शाखा निर्देश एक गठबंधन स्मृति स्थान पर इंगित करता है। – ysap

+0

समझा। यह एक बड़ा सवाल है! – ruakh

उत्तर

3

उम्म, क्या यह नहीं है कि जीसीसी का -falign-loops विकल्प क्या है?

+0

हां, लेकिन अगर आप केवल एक लूप को प्रभावित करना चाहते हैं तो क्या होगा। क्या जीसीसी का कोई समाधान है? –

+1

एक ही फ़ंक्शन के लिए, आप '#pragma GCC Optimize' या समकक्ष विशेषताओं का उपयोग कर सकते हैं। मुझे नहीं पता कि आप इसे एकल लूप स्तर पर कर सकते हैं या नहीं। यदि कोई अन्य तरीका नहीं है, तो आप लूप को नेस्टेड फ़ंक्शन में डालकर और नेस्टेड फ़ंक्शन पर विशेषता डालकर एक भयानक हैक के साथ इसे प्राप्त कर सकते हैं ...? –

+0

लक्षित एकल-फ़ंक्शन ऑप्टिमाइज़ेशन अभी भी प्रोजेक्ट-वाइड विकल्प से बेहतर तरीका है, क्योंकि यह कुछ परिस्थितियों (हॉट लूप) और दूसरों में खराब (दुर्लभ लूप) में अच्छा हो सकता है। दुर्भाग्यवश, न तो '#pragma जीसीसी अनुकूलित करें' align-loops = xx "' nor '__attribute __ ((अनुकूलित करें ("align-loops = xx")))' मेरे परीक्षणों में कोई प्रभाव उत्पन्न करने लगते हैं (उसी 'md5sum' पर उत्पन्न बाइनरी)। – Cyan

संबंधित मुद्दे