मैं ओपनएसीसी (पीजीआई के कंपाइलर के साथ) सीख रहा हूं और मैट्रिक्स गुणा उदाहरण को अनुकूलित करने की कोशिश कर रहा हूं।ओपनएसीसी का उपयोग कर मैट्रिक्स गुणा को अनुकूलित करने के लिए कैसे?
void matrix_mul(float *restrict r, float *a, float *b, int N, int accelerate){
#pragma acc data copyin (a[0: N * N ], b[0: N * N]) copyout (r [0: N * N ]) if(accelerate)
{
# pragma acc region if(accelerate)
{
# pragma acc loop independent vector(32)
for (int j = 0; j < N; j ++)
{
# pragma acc loop independent vector(32)
for (int i = 0; i < N ; i ++)
{
float sum = 0;
for (int k = 0; k < N ; k ++) {
sum += a [ i + k*N ] * b [ k + j * N ];
}
r[i + j * N ] = sum ;
}
}
}
}
यह आकार 32x32 धागे की धागा ब्लॉक में परिणाम है और मुझे सबसे अच्छा प्रदर्शन अब तक देता है: सबसे तेजी से कार्यान्वयन मैं अब तक आया निम्नलिखित है। यहाँ मानक हैं:
Matrix multiplication (1500x1500):
GPU: Geforce GT650 M, 64-bit Linux
Data sz : 1500
Unaccelerated:
matrix_mul() time : 5873.255333 msec
Accelerated:
matrix_mul() time : 420.414700 msec
Data size : 1750 x 1750
matrix_mul() time : 876.271200 msec
Data size : 2000 x 2000
matrix_mul() time : 1147.783400 msec
Data size : 2250 x 2250
matrix_mul() time : 1863.458100 msec
Data size : 2500 x 2500
matrix_mul() time : 2516.493200 msec
दुर्भाग्य से मुझे एहसास हुआ कि उत्पन्न CUDA कोड काफी आदिम है (उदाहरण के लिए तो यह और भी साझा स्मृति का उपयोग नहीं करता) और इसलिए हाथ से अनुकूलित CUDA कार्यक्रम के साथ प्रतिस्पर्धा नहीं कर सकते।
Arrayfire 1500 x 1500 matrix mul
CUDA toolkit 4.2, driver 295.59
GPU0 GeForce GT 650M, 2048 MB, Compute 3.0 (single,double)
Memory Usage: 1932 MB free (2048 MB total)
af: 0.03166 seconds
Arrayfire 1750 x 1750 matrix mul
af: 0.05042 seconds
Arrayfire 2000 x 2000 matrix mul
af: 0.07493 seconds
Arrayfire 2250 x 2250 matrix mul
af: 0.10786 seconds
Arrayfire 2500 x 2500 matrix mul
af: 0.14795 seconds
मुझे आश्चर्य है कि अगर वहाँ किसी भी सुझाव कैसे OpenACC से बेहतर प्रदर्शन प्राप्त करने के लिए: एक संदर्भ कार्यान्वयन के रूप में मैं निम्नलिखित परिणामों के साथ Arrayfire lib ले गया? शायद निर्देशों की मेरी पसंद सही नहीं है?
यह समस्या कंपाइलर निर्देश बनाम CUDA/OpenCL के विभिन्न दृष्टिकोण को दर्शाती है। कूडा/ओपनसीएल एच/डब्ल्यू के बहुत करीब है; जहां आप एक एच/डब्ल्यू मंच के लिए अनुकूलित और tweak कर सकते हैं। आप आंतरिक लूप कंप्यूटिंग 2,4, या 8 को अनलोल कर सकते हैं ... इस प्रकार आंतरिक लूपों की संख्या को कम कर देता है –
हू अच्छा विचार, धन्यवाद .. हाँ मुझे पता है, CUDA/OpenCL को "निम्न-स्तरीय" एपीआई माना जा सकता है, मैं खुद पुराने कुडा स्कूल से हूं। दूसरी तरफ, ओपनएसीसी के पास भविष्य में अधिक क्षमता है क्योंकि यह केवल जीपीयू और निश्चित रूप से विकास लागत तक ही सीमित नहीं है। फिर भी, यह अच्छा होगा अगर ओपनएसीसी कंपाइलर्स कम्प्यूटेशंस के लिए जीपीयू की साझा मेमोरी का फायदा उठा सकें: मुझे पता है कि ओपनएसीसी 'कैश' निर्देश है लेकिन मैं इसे –