का उपयोग कर 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 देखें।)
क्या यह सी ++ 98 या सी ++ 11 है? – user1071136
सी ++ 11 उत्तरों ठीक हैं –
वैसे, यह क्यों है कि आपके मामले में परमाणु-मिनट तेज है? मुझे एक ऐसी ही समस्या थी जहां कमी-मिनट ने प्रदर्शन में सुधार नहीं किया था, इसलिए शायद मुझे परमाणु-मिनट का प्रयास करना चाहिए। – user1071136