2011-07-16 17 views
6

का उपयोग करके सेगमेंटेशन गलती मैं कुछ एसएसई कोड में ओपनएमपी जोड़ने का प्रयोग शुरू कर रहा हूं।ओपनएमपी और एसएसई

मेरा पहला टेस्ट प्रोग्राम SOMETIMES _mm_set_ps में क्रैश हो जाता है, लेकिन जब मैं if (0) सेट करता हूं तो काम करता है।

यह इतना आसान लग रहा है कि मुझे कुछ स्पष्ट याद आना चाहिए। मैं जीसीसी के साथ संकलन कर रहा हूँ -fopenmp जी मार्च = core2 -pthreads

#include <stdio.h> 
    #include <stdlib.h> 
    #include <immintrin.h> 

    int main() 
    { 
    #pragma omp parallel if (1) 
    { 
    #pragma omp sections 
     { 
    #pragma omp section 
      { 
       __m128 x1 = _mm_set_ps (1.1f, 2.1f, 3.1f, 4.1f); 
      } 
    #pragma omp section 
      { 
       __m128 x2 = _mm_set_ps (1.2f, 2.2f, 3.2f, 4.2f); 
      } 
     } // end omp sections 
    } //end omp parallel 

    return 0; 
    } 

उत्तर

6

यह ओपनएमपी कार्यान्वयन में एक बग है। मुझे विंडोज़ (जीएनजीडब्लू) पर जीसीसी में एक ही समस्या थी। -mstackrealign कमांड लाइन विकल्प मेरी समस्या हल हो गया। यह 16-बाइट सीमा पर स्टैक को रीयलिन करने के लिए प्रत्येक फ़ंक्शन के प्रस्ताव के लिए एक निर्देश जोड़ता है। मैंने कोई प्रदर्शन जुर्माना नहीं देखा। आप फ़ंक्शन घोषणा के लिए __attribute__ ((force_align_arg_pointer)) जोड़ने का भी प्रयास कर सकते हैं, जो ऐसा ही करना चाहिए, लेकिन केवल एक विशिष्ट फ़ंक्शन के लिए। आपको एसएसई कोड को एक अलग फ़ंक्शन में रखना पड़ सकता है जिसे आप फ़ंक्शन से #pragma omp के साथ कॉल करते हैं, ताकि स्टैक को वास्तविकता प्राप्त करने का मौका मिले।

जब मैं 64-बिट लक्ष्य (MinGW64, जैसे TDM GCC बिल्ड) के लिए संकलन करने के लिए चला गया तो समस्या को रोकना बंद कर दिया।

मैं एवीएक्स निर्देशों के साथ खेल रहा हूं जिसके लिए 32-बाइट संरेखण की आवश्यकता है, लेकिन जीसीसी विंडोज़ के लिए इसका समर्थन नहीं करता है। इसने मुझे एक पायथन लिपि का उपयोग करके उत्पादित असेंबली कोड को ठीक करने के लिए मजबूर किया, लेकिन यह काम करता है।

+0

का उपयोग कर -स्टास्टाइनलाइन ने इस मुद्दे को हल किया है। और यदि कोई प्रदर्शन जुर्माना है, तो यह अभी भी प्रदर्शन से बेहतर है! मैं देखता हूं कि यह कुछ और जटिल कोड के साथ कैसे जाता है। आपकी सहायता के लिए धन्यवाद. दुर्भाग्य से, मेरे पास खेलने के लिए 64-बिट मशीन नहीं है। मेरे पास एक एवीएक्स पीसी है, इसलिए यह एक शर्म की बात है कि जीसीसी अभी तक इसका समर्थन नहीं करता है। –

+0

सटीक होने के लिए, जीसीसी कोर i7 2 जीन (सैंडी ब्रिज) समेत एवीएक्स का समर्थन करता है, और जो मैंने ऑनलाइन पढ़ा है, वह लिनक्स पर बहुत अच्छा काम करता है। लेकिन मुझे MinGW64 के साथ विंडोज़ पर बहुत से सेगमेंटेशन गलती की समस्याएं आई हैं, इसलिए शायद यह एक मिनीजीडब्लू संबंधित बग होगा। लेकिन मैं बस कुछ गलत कर रहा हूं ... –

+0

जी ++ विकल्प '-mstackrealign' पूरी तरह से काम किया। वैकल्पिक रूप से, मेरे मामले में मुझे यह सुनिश्चित करने के लिए 'नोलाइनलाइन' विशेषता भी जोड़नी पड़ी कि फ़ंक्शन कॉल पहले स्थान पर था: '__attribute __ ((force_align_arg_pointer, noinline))' – phfaist

2

मैं असंरेखित स्मृति पहुँच गंध आती है। इसका एकमात्र तरीका कोड विस्फोट कर सकता है (मानते हैं कि एकमात्र कोड है)। इसके लिए एक्सएमएम रजिस्टरों का उपयोग नहीं किया जाएगा बल्कि स्मृति को ढेर किया जाएगा, जो केवल 4 बाइट्स के साथ गठबंधन है, मेरा अनुमान है कि ओएमपी कोड स्टैक के संरेखण को गड़बड़ कर रहा है।

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