2012-01-19 15 views
5

बनाम मैं सरल गिरी है?OpenCL अदिश वेक्टर

सभी ट्यूटोरियल का कहना है, कि वेक्टर प्रकार का उपयोग कर गणना को गति ...

मेजबान पक्ष, स्मृति Float4 तर्क के लिए alocated पर 16 बाइट्स गठबंधन और global_work_size clEnqueueNDRangeKernel 4 बार छोटा होता है के लिए है।

कर्नेल एएमडी एचडी 5770 जीपीयू, एएमडी-एपीपी-एसडीके-वी 2.6 पर चलता है। CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT के लिए

उपकरण जानकारी देता है 4.

संपादित करें:
global_work_size = 1024 * 1024 (और अधिक)
local_work_size = 256
समय CL_PROFILING_COMMAND_START और CL_PROFILING_COMMAND_END का उपयोग कर मापा जाता है।

छोटे global_work_size (फ्लोट 4 के लिए फ्लोट/2048 के लिए 8196) के लिए, वेक्टरिज्ड संस्करण तेज है, लेकिन मैं जानना चाहता हूं, क्यों?

+1

वैश्विक कार्य आकार और कार्यसमूह के आकार के मूल्य क्या हैं? आप किस समय माप रहे हैं, और कैसे? –

+0

वैश्विक कार्य आकार = 1024 * 1024 स्थानीय कार्य आकार = 256, मैं CL_PROFILING_COMMAND_START और CL_PROFILING_COMMAND_END का उपयोग करके clEnquueNDRange कर्नेल का समय मापता हूं। छोटे global_work_size (फ्लोट 4 के लिए फ्लोट/2048 के लिए 8196) के लिए, वेक्टरिज्ड संस्करण तेज है, लेकिन मैं जानना चाहता हूं, क्यों? – ldanko

+0

छोटे और बड़े काम के आकार के बीच का अंतर आपके निरंतर कैश के कारण हो सकता है। तो 2 प्रश्न: 1) यदि आप कॉन्स को हटाते हैं, तो क्या यह अभी भी छोटे और धीमे के लिए धीमा है? 2) यदि आप कहीं भी अंदर जाते हैं, तो फ्लोट के लिए 65536 और फ्लोट 4 के लिए 16384 कहें, तब क्या होता है? – user1111929

उत्तर

5

मैं ट्यूटोरियल आप का उल्लेख कर रहे हैं क्या पता नहीं है, लेकिन किसी का होना चाहिए। एटीआई और एनवीआईडीआईए कम से कम आधे दशक के लिए स्केलर जीपीयू आर्किटेक्चर का उपयोग करते हैं। आजकल आपके कोड में वैक्टर का उपयोग सिंटैक्टिकल सुविधा के लिए है, यह सादे स्केलर कोड पर कोई प्रदर्शन लाभ नहीं देता है। यह पता चला है कि स्केलर आर्किटेक्चर जीपीयू के लिए बेहतर है - हार्डवेयर संसाधनों का उपयोग करने में यह बेहतर है।

1

मुझे यकीन नहीं है कि वर्कग्रुप और वैश्विक आकार के बारे में और जानने के बिना वेक्टर आपके लिए इतना धीमा क्यों होंगे। मैं कम से कम एक ही प्रदर्शन की उम्मीद करता हूं।

यदि यह आपके कर्नेल के लिए उपयुक्त है, तो क्या आप सी में मूल्यों को सी से शुरू कर सकते हैं? इससे 33% तक मेमोरी एक्सेस कम हो जाएगी। शायद यह आपकी स्थिति पर लागू होता है?

__kernel vecadd(__global const float4 *B, 
       __global float4 *C) 
{ 
    int idx = get_global_id(0); 
    C[idx] += B[idx]; 
} 

इसके अलावा, क्या आप एक निजी वेक्टर के मूल्यों में पढ़कर थक गए हैं? या शायद दोनों रणनीतियों।

__kernel vecadd(__global const float4 *A, 
       __global const float4 *B, 
       __global float4 *C) 
{ 
    int idx = get_global_id(0); 
    float4 tmp = A[idx] + B[idx]; 
    C[idx] = tmp; 
} 
संबंधित मुद्दे