तो यह कुछ हो सकता है कि आप करें को स्वयं को लागू करना होगा, क्योंकि लाइब्रेरी आपके लिए यह नहीं करेगी। (शायद कुछ इसे बीएलएएस स्तर 3 दिनचर्या के संदर्भ में लागू करने का कोई तरीका है - निश्चित रूप से मैट्रिक्स तत्वों का वर्ग - लेकिन इसमें महंगी और अन्यथा अनावश्यक मैट्रिक्स-वेक्टर गुणा शामिल होंगे। और मुझे अभी भी पता नहीं है कि आप कैसे ' डी स्क्वायररूट ऑपरेशन करते हैं)। कारण यह है कि ये ऑपरेशन वास्तव में रैखिक-बीजगणित प्रक्रिया नहीं हैं; प्रत्येक मैट्रिक्स तत्व के वर्ग रूट को लेना वास्तव में किसी भी मौलिक रैखिक बीजगणित ऑपरेशन से मेल नहीं खाता है।
अच्छी खबर यह है कि इन तत्वों के संचालन CUDA में लागू करने के लिए बहुत ही सरल हैं। फिर, बहुत सारे ट्यूनिंग विकल्प हैं जो सर्वश्रेष्ठ प्रदर्शन के लिए खेल सकते हैं, लेकिन कोई भी काफी आसानी से शुरू कर सकता है।
मैट्रिक्स अतिरिक्त संचालन के साथ, आप यहां एनएक्सएम मैट्रिक्स का इलाज करेंगे (एन * एम) - लम्बाई वैक्टर; मैट्रिक्स की संरचना इन तत्वों के संचालन के लिए कोई फर्क नहीं पड़ता। तो आप मैट्रिक्स के पहले तत्व में पॉइंटर में गुजरेंगे और एन * एम संख्याओं की एक सूची के रूप में इसका इलाज करेंगे। (मैं, आप यहाँ float
रों उपयोग कर रहे हैं ग्रहण करने के लिए जा रहा हूँ के रूप में आप SGEMM
के बारे में और पहले SAXPY
बात कर रहे थे।)
गिरी, जो आपरेशन लागू करता CUDA कोड की वास्तविक सा, बहुत सरल है। अभी के लिए, प्रत्येक धागा एक सरणी तत्व के वर्ग (या वर्ग) को गणना करेगा। (चाहे यह इष्टतम है या प्रदर्शन के लिए नहीं है, आप परीक्षण कर सकते हैं)। तो कर्नल निम्नलिखित की तरह दिखेगा। मुझे लगता है कि आप कुछ कर रहे हैं जैसे B_ij = (A_ij)^2; यदि आप आपरेशन inplace, जैसे A_ij = (A_ij)^2 करना चाहता था, आप ऐसा भी कर सकता है,:
__global__ void squareElements(float *a, float *b, int N) {
/* which element does this compute? */
int tid = blockDim.x * blockIdx.x + threadIdx.x;
/* if valid, squre the array element */
if (tid < N)
b[tid] = (a[tid]*a[tid]);
}
__global__ void sqrtElements(float *a, float *b, int N) {
/* which element does this compute? */
int tid = blockDim.x * blockIdx.x + threadIdx.x;
/* if valid, sqrt the array element */
if (tid < N)
b[tid] = sqrt(a[tid]); /* or sqrtf() */
}
ध्यान दें कि आप बहुत थोड़ी वृद्धि हुई त्रुटि, 'sqrtf साथ ठीक कर रहे हैं() 'फ़ंक्शन जिसमें 3 उल (अधिकतम स्थान पर इकाइयां) की अधिकतम त्रुटि है, वह काफी तेज है।
आप इन कर्नेल को कैसे कॉल करते हैं, उस क्रम पर निर्भर करते हैं जिसमें आप चीजें कर रहे हैं। यदि आप पहले से ही इन मैट्रिक्स पर कुछ कबाल कॉल कर चुके हैं, तो आप उन्हें उन एरे पर उपयोग करना चाहेंगे जो पहले ही GPU मेमोरी में हैं।
नोट, यह मैट्रिक्स एक्सपोनेंटिएशन नहीं है (न ही यह रूट माध्य वर्ग है)। आप बस व्यक्तिगत तत्वों पर स्केलर संचालन कर रहे हैं। –
गलती के लिए क्षमा करें, हां मुझे ऐसे परिचालन करने की आवश्यकता है –
मैंने तदनुसार प्रश्न शीर्षक अपडेट किया है। –