मैं ओपनएमपी का उपयोग कर समानांतर तरीके से युगल की एक श्रृंखला में लिखने (अपडेट) करने की कोशिश कर रहा हूं। विचार यह है कि जिस तत्व को अद्यतन करने की आवश्यकता है उसे एक से अधिक बार अपडेट किया जा सकता है और तत्व स्वयं पर फ्लाई पर गणना की जाती है। यह दौड़ की स्थिति के लिए बहुत प्रवण होता है जब तक कि मैं उस परमाणु ऑपरेशन के साथ अद्यतन होने वाले तत्व के लिए मेमोरी क्षेत्र संवाददाता को "लॉक" नहीं करता। नीचे दिए गए उदाहरण के रूप में:परमाणु संचालन के साथ युगल की सरणी अद्यतन करना
#include<omp.h>
#include<stdlib.h>
int main()
{
double *x=NULL, contribution = 1234.5;
size_t xlen=1000, i, n;
if ((x = (double *) calloc(xlen,sizeof(double))) == NULL) exit(-1)
#pragma omp parallel for shared(x) private(n,contribution)
for (i=0; i<xlen; i++) {
n = find_n_on_the_fly(i);
#pragma omp atomic update
x[n]+=contribution; // in the more complicated case contributions are different
}
return 0;
}
मैं अभी भी इस दृष्टिकोण के साथ दौड़ की स्थिति में दौड़ रहा हूं। मैंने महत्वपूर्ण वर्गों का उपयोग करने की कोशिश की लेकिन यह पूरी तरह से मारता है क्योंकि सरणी बड़ी हैं और अपडेट की संख्या भी बड़ी है।
प्रश्न: इस दृष्टिकोण के साथ क्या गलत है? क्या इसे संभालने का कोई बेहतर तरीका है?
नोट: इसे संभालने के लिए मैं धागे के प्रत्येक के लिए सरणी की प्रतियां बनाकर और बाद में उन्हें कम करके कुछ बेवकूफ कर रहा हूं। लेकिन स्मृति सीमाएं मुझे आगे जाने की अनुमति नहीं देती हैं।
क्यों नहीं 'एन' /' योगदान 'जोड़े की सूची बनाएं, इसमें धक्का रखें, फिर उन्हें' x' सरणी, या किसी अन्य प्रकार के स्पैस प्रतिनिधित्व में कम करें? – user3528438
@ user3528438 यह एक विचार है और मेरे नोट के अनुरूप है। क्या आपके पास एक वास्तविक कामकाजी उदाहरण है जो कि मैं पहले से ही क्या कर रहा हूं उससे कम नहीं करता? –
परिभाषा के अनुसार, 64-बिट मान के लिए एक परमाणु संचालन केवल 64-बिट (या अधिक) हार्डवेयर आर्किटेक्चर के साथ संभव है। फ़्लोटिंग पॉइंट लाइब्रेरी उस मुद्दे की जड़ पर हो सकती है जो आप यहां देख रहे हैं। क्या आपने टाइपिंग को 'हस्ताक्षरित लंबे समय तक' करने का प्रयास किया है? साथ ही, प्रत्येक तत्व के लिए लूप के माध्यम से खोजने के बजाय, हैश तालिका सरणी तत्वों को देखने के लिए बहुत तेज होगी। –