2012-09-04 18 views
7

का उपयोग कर x86 पर परमाणु न्यूनतम क्या ओपनएमपी सी ++ 11 के लिए परमाणु न्यूनतम समर्थन करता है? यदि ओपनएमपी में कोई पोर्टेबल विधि नहीं है: क्या x86 या amd64 सुविधा का उपयोग कर ऐसा करने का कोई तरीका है?ओपनएमपी

ओपनएमपी विनिर्देशों में मुझे सी ++ के लिए कुछ भी नहीं मिला लेकिन फोरट्रान संस्करण इसका समर्थन करता प्रतीत होता है। विवरण के लिए v3.1 के 2.8.5 देखें। सी के लिए ++ यह कहा गया

binop की +, *, एक है -, /, &, ^, |, < <, या >>।

लेकिन फोरट्रान के लिए यह कहा गया

intrinsic_procedure_name मैक्स, मिन, Iand, आईओआर, या IEOR से एक है।

मामले में आप अधिक संदर्भ में रुचि रखते हैं: मैं निम्नलिखित करने का एक म्युटेक्स मुक्त विधि रहा हूँ:

vector<omp_lock_t>lock; 
vector<int>val; 

#pragma omp parallel 
{ 
    // ... 
    int x = ...; 
    int y = ...; 
    if(y < val[x]){ 
    omp_set_lock(&lock[x]); 
    if(y < val[x]) 
     val[x] = y; 
    omp_unset_lock(&lock[x]); 
    } 
} 

मैं जानता हूँ कि आप एक एल्गोरिथ्म को कम का उपयोग कर कम से कम की गणना कर सकते हैं। मुझे पता है कि ऐसी परिस्थितियां हैं जहां यह किसी भी परमाणु न्यूनतम दृष्टिकोण से काफी हद तक बेहतर प्रदर्शन करती है। हालांकि, मुझे यह भी पता है कि यह मेरी स्थिति में मामला नहीं है।

संपादित करें: एक विकल्प थोड़ा तेज है कि मेरे मामले में

int x = ...; 
    int y = ...; 
    while(y < val[x]) 
    val[x] = y; 

है, लेकिन है कि कोई परमाणु ऑपरेशन है।

सभी नए जीपीयू में यह सुविधा है और मैं इसे सीपीयू पर याद कर रहा हूं। (ओपनसीएल के लिए atom_min देखें।)

+0

क्या यह सी ++ 98 या सी ++ 11 है? – user1071136

+0

सी ++ 11 उत्तरों ठीक हैं –

+0

वैसे, यह क्यों है कि आपके मामले में परमाणु-मिनट तेज है? मुझे एक ऐसी ही समस्या थी जहां कमी-मिनट ने प्रदर्शन में सुधार नहीं किया था, इसलिए शायद मुझे परमाणु-मिनट का प्रयास करना चाहिए। – user1071136

उत्तर

4

सी ++ के लिए ओपनएमपी विनिर्देश पर परमाणु न्यूनतम के लिए समर्थन नहीं है। न तो सी ++ 11 करता है।

मुझे लगता है कि आपके एल्गोरिदम में, x थ्रेड के बावजूद, किसी वैध सूचकांक की गणना कर सकता है। मैं आपके एल्गोरिदम को बदलने का सुझाव दूंगा, ताकि प्रत्येक थ्रेड अपने val सरणी का उपयोग कर सके और फिर अंत में अंतिम समाधान करें, जिसे इंडेक्स द्वारा समांतर भी किया जा सकता है। यह ताले और परमाणुओं से पूरी तरह से बच जाएगा और आपको प्रत्येक थ्रेड के लिए डेटा को अलग करने का लाभ देगा, यानी झूठी कैश साझा करने का कोई मौका नहीं है। दूसरे शब्दों में, यह तेज़ होना चाहिए।

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