2011-03-27 10 views
5

मै मैट्रिक्स संचालन के लिए CUBLAS (Cuda Blas पुस्तकालय) का उपयोग कर रहा हूं।कब्बास - मैट्रिक्स-तत्व एक्सपोनेंटिएशन संभव है?

मैट्रिक्स आइटम्स के एक्सपोनिएशन/रूट माध्य वर्ग को प्राप्त करने के लिए CUBLAS का उपयोग करना संभव है?

मेरा मतलब है, 2x2 मैट्रिक्स

1 4 
9 16 

क्या मैं चाहता हूँ जैसे किसी दिए गए मूल्य को ऊपर उठाने के लिए एक समारोह है होने 2

1 16 
81 256 

और मूल माध्य वर्ग की गणना करना

1 2 
3 4 

क्या यह CUBLAS के साथ संभव है? मुझे इस लक्ष्य के लिए उपयुक्त कोई फ़ंक्शन नहीं मिल रहा है, लेकिन मैं अपने स्वयं के कर्नेल को कोडिंग शुरू करने के लिए पहले यहां पूछूंगा।

+2

नोट, यह मैट्रिक्स एक्सपोनेंटिएशन नहीं है (न ही यह रूट माध्य वर्ग है)। आप बस व्यक्तिगत तत्वों पर स्केलर संचालन कर रहे हैं। –

+0

गलती के लिए क्षमा करें, हां मुझे ऐसे परिचालन करने की आवश्यकता है –

+0

मैंने तदनुसार प्रश्न शीर्षक अपडेट किया है। –

उत्तर

9

तो यह कुछ हो सकता है कि आप करें को स्वयं को लागू करना होगा, क्योंकि लाइब्रेरी आपके लिए यह नहीं करेगी। (शायद कुछ इसे बीएलएएस स्तर 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 मेमोरी में हैं।

+0

आपको बहुत धन्यवाद जोनाथन, आपने मेरी मदद करने के लिए भी बहुत कुछ लिखा है। मैं अभी भी सोच रहा हूं कि कुछ छोटे सूक्ष्म विवरणों को कैसे कार्यान्वित किया जाए (ब्लॉक/धागे की संख्या, कोलेसेन्स को अधिकतम कैसे करें, ecc ..) लेकिन मैं कोशिश करता हूं और पहले कुछ परीक्षण चल रहा हूं। यदि मुझे कोई अन्य संदेह है तो मुझे एक और प्रश्न पोस्ट होगा आपकी मदद के लिए फिर से धन्यवाद! –

+1

उपयोगकर्ता @ सोल्विंगप्लेक्स ने सही ढंग से इंगित किया कि उपर्युक्त कोड में 'block_id' जो निश्चित रूप से' blockIdx.x' होना चाहिए; मुझे नहीं पता कि मैंने वहां 'block_id' क्यों रखा है। –

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