मैं एक साधारण संख्यात्मक विश्लेषण कोड (ट्रिपिज़ियम नियम संख्यात्मक एकीकरण) को बदलने की कोशिश कर रहा हूं जो कि मेरी सीयूडीए सक्षम GPU। वहाँ साहित्य के बहुत सारे हैं, लेकिन यह सब यहाँ जितना जरूरी है उससे ज्यादा जटिल लग रहा है! मेरा वर्तमान कोड है:
#include & lt; stdio.h & gt; # शामिल करें & lt; math.h & gt; # शामिल करें & lt; stdlib.h & gt; # परिभाषित एन 1000 डबल फ़ंक्शन (डबल); Int मुख्य (शून्य) {int i; डबल कम_बाउंड, ऊपरी-बी, एच, एनएएस; Printf ("नीचे और ऊपरी सीमा दर्ज करें:"); Scanf ("% lf% lf", & amp; amp; low_bound; & amp; ऊपरी_बाउंड); एच = (ऊपरी - निचला) / एन; Ans = (फ़ंक्शन (कम) + फ़ंक्शन (ऊपरी)) / 2.0; के लिए (i = 1; i & lt; N; ++ i) {ans + = फ़ंक्शन (i * h); } Printf ("अभिन्न है:% .20lf \ n", h * ans)); वापसी 0; } डबल फ़ंक्शन (डबल एक्स) {वापसी पाप (एक्स); }
यह ठीक से चलता है जब तक एन बहुत बड़ा हो जाता है। मैंने ओपनएमपी के साथ एक कार्यान्वयन किया है जो कि तेज़ है, लेकिन मुझे लगता है कि यह सीयूडीए के बारे में कुछ भी जानने में आसान होगा। क्या किसी को इस बारे में कोई सुझाव मिला है कि कहां से शुरू करना है या यदि इस कोड को परिवर्तित करने के लिए कोई दर्द रहित तरीका है? बहुत धन्यवाद, जैक।
यह लूप है जो समानांतर धागे को वितरित करना होगा। आप प्रत्येक थ्रेड (idx = 0 ... N-1) के लिए एक अद्वितीय अनुक्रमणिका की गणना कर सकते हैं। प्रत्येक धागा केवल इंटीग्रल के अपने व्यक्तिगत भाग की गणना करता है और एक सामान्य सरणी (इन्टिग्रल [आईडीएक्स]) में अपनी स्थिति में जवाब को स्टोर करता है। फिर आप एक प्रक्रिया का उपयोग करके सब कुछ जोड़ सकते हैं जिसे समानांतर स्कैन या इकट्ठा किया जाता है। NVIDIA क्यूडा उदाहरणों में उदाहरण हैं सबसे आसान तरीका जोर पुस्तकालय का उपयोग करना होगा। आप बस इसे "इन मूल्यों को जोड़" बताते हैं और यह सबसे तेज़ तरीका की गणना करता है।
Comments
Post a Comment