2013-07-30 20 views
9

मुझे ओपनसीएल/ओपनजीएल इंटरऑप के साथ कई जीपीयू का उपयोग करने में परेशानी हो रही है। मैं एक ऐसा एप्लीकेशन लिखने की कोशिश कर रहा हूं जो एक गहन गणना के परिणाम प्रदान करता है। अंत में यह एक अनुकूलन समस्या चलाएगा, और उसके बाद, परिणाम के आधार पर, स्क्रीन पर कुछ प्रस्तुत करें। एक परीक्षण मामले के रूप में, मैं इस पाठ्यक्रम से कण सिमुलेशन उदाहरण कोड से शुरू कर रहा हूं: http://web.engr.oregonstate.edu/~mjb/sig13/एकाधिक जीपीयू के साथ ओपनसीएल/ओपनजीएल इंटरऑप

उदाहरण कोड बनाता है और ओपनजीएल संदर्भ, फिर एक ओपनसीएल संदर्भ बनाता है जो cl_khr_gl_sharing एक्सटेंशन का उपयोग करके राज्य को साझा करता है। जब मैं एक जीपीयू का उपयोग करता हूं तो सब ठीक काम करता है। एक संदर्भ बनाना इस तरह दिखता है:

3. create an opencl context based on the opengl context: 
    cl_context_properties props[ ] = 
    { 
     CL_GL_CONTEXT_KHR, (cl_context_properties) glXGetCurrentContext(), 
     CL_GLX_DISPLAY_KHR, (cl_context_properties) glXGetCurrentDisplay(), 
     CL_CONTEXT_PLATFORM, (cl_context_properties) Platform, 
     0 
    }; 

    cl_context Context = clCreateContext(props, 1, Device, NULL, NULL, &status); 
    if(status != CL_SUCCESS) 
    { 
     PrintCLError(status, "clCreateContext: "); 
     exit(1); 
    } 

clCreateFromGLBuffer साथ बाद में, उदाहरण के साझा बनाता सीएल/जीएल बफ़र्स।

अब, मैं दो GPU उपकरणों से एक संदर्भ बनाने के लिए करना चाहते हैं:

cl_context Context = clCreateContext(props, 2, Device, NULL, NULL, &status); 

मैं सफलतापूर्वक उपकरणों खोल दिया है, और है कि वे दोनों समर्थन cl_khr_gl_sharing क्वेरी कर सकता है, और दोनों काम अलग-अलग। हालांकि, जब के रूप में उपरोक्त संदर्भ बनाने के प्रयास में, मैं

CL_INVALID_OPERATION 

कौन सा cl_khr_gl_sharing विस्तार से जोड़ा एक त्रुटि कोड है मिलता है। विस्तार वर्णन में (ऊपर लिंक) यह कहता है

  • CL_INVALID_OPERATION अगर एक संदर्भ या साझा समूह वस्तु CGL, EGL, GLX, या WGL में से एक और निम्न स्थितियों में से किसी के लिए निर्दिष्ट किया गया था पकड़:

    • ओपन कार्यान्वयन खिड़की प्रणाली बाध्यकारी एपीआई जिसके लिए एक संदर्भ या साझा समूह वस्तुओं निर्दिष्ट था समर्थन नहीं करता।
    • से अधिक विशेषताओं CL_CGL_SHAREGROUP_KHR में से एक, CL_EGL_DISPLAY_KHR, CL_GLX_DISPLAY_KHR, और CL_WGL_HDC_KHR एक गैर डिफ़ॉल्ट मान पर सेट है।
    • दोनों गुण CL_CGL_SHAREGROUP_KHR और CL_GL_CONTEXT_KHR गैर-डिफ़ॉल्ट मानों पर सेट हैं।
    • तर्क में निर्दिष्ट उपकरणों का कोई भी नहीं कर सकते हैं समर्थन OpenCL वस्तुओं जो हिस्सा एक ओपन वस्तु का डेटा संग्रह अनुभाग 9.12 में वर्णित है,। "

वर्णन नहीं है कि मेरे किसी भी मामले में ठीक से लग रहा है। क्या एकाधिक जीपीयू के साथ ओपनसीएल/ओपनजीएल इंटरऑप करना संभव नहीं है? या यह है कि मेरे पास विषम हार्डवेयर है? मैंने अपने गणित उपकरणों से कुछ पैरामीटर मुद्रित किए हैं। मैंने अभी दो यादृच्छिक लिया है जीपीयू जिन्हें मैं अपना हाथ मिल सकता था।

PlatformID: 18483216 
Num Devices: 2 

-------- Device 00 --------- 
CL_DEVICE_NAME: GeForce GTX 285 
CL_DEVICE_VENDOR: NVIDIA Corporation 
CL_DEVICE_VERSION: OpenCL 1.0 CUDA 
CL_DRIVER_VERSION: 304.88 
CL_DEVICE_MAX_COMPUTE_UNITS: 30 
CL_DEVICE_MAX_CLOCK_FREQUENCY: 1476 
CL_DEVICE_TYPE: CL_DEVICE_TYPE_GPU 

-------- Device 01 --------- 
CL_DEVICE_NAME: Quadro FX 580 
CL_DEVICE_VENDOR: NVIDIA Corporation 
CL_DEVICE_VERSION: OpenCL 1.0 CUDA 
CL_DRIVER_VERSION: 304.88 
CL_DEVICE_MAX_COMPUTE_UNITS: 4 
CL_DEVICE_MAX_CLOCK_FREQUENCY: 1125 
CL_DEVICE_TYPE: CL_DEVICE_TYPE_GPU 

cl_khr_gl_sharing is supported on dev 0. 
cl_khr_gl_sharing is supported on dev 1. 

ध्यान दें कि यदि मैं इंटरऑप भाग के बिना संदर्भ बना देता हूं (जैसे कि प्रोप सरणी नीचे जैसा दिखता है) तो यह सफलतापूर्वक संदर्भ बनाता है, लेकिन स्पष्ट रूप से एप्लिकेशन के ओपनजीएल पक्ष के साथ बफर साझा नहीं कर सकता है।

cl_context_properties props[ ] = 
{ 
    CL_CONTEXT_PLATFORM, (cl_context_properties) Platform, 
    0 
}; 
+0

आपकी समस्या का कारण जरूरी नहीं है, लेकिन यदि मैं आपका था तो मैं पहले अपने ड्राइवरों को अपडेट करता था ... उदाहरण के लिए, वे काफी पुराने हैं, उदाहरण के लिए आपके जीटीएक्स 285 के लिए लिनक्स 64 बिट के लिए वर्तमान ड्राइवर संस्करण 319.32 (v बीटा में 325.08)। – CaptainObvious

+0

क्या आपके ओपनसीएल संदर्भ में जीपीयू दोनों शामिल हैं? आपको दो GPUs के बीच डेटा को स्थानांतरित करने के कार्यान्वयन के लिए ऐसा करने की आवश्यकता है ताकि एक जीपीयू के परिणाम दूसरे द्वारा प्रस्तुत किए जा सकें। – chippies

+0

@chippies मुझे OpenCL संदर्भ बनाने का प्रयास करते समय त्रुटि मिल रही है। वहां कोड में, डिवाइस एक सरणी है जिसमें GPUs दोनों शामिल हैं। – matth

उत्तर

1

जब आप इन दो पंक्तियों कहते हैं। आप आम तौर पर केवल एक ओपनसीएल संदर्भ को एक थ्रेड पर एक डिवाइस के लिए एक ओपनजीएल संदर्भ के साथ जोड़ सकते हैं।

+0

इसका उत्तर देने के लिए समय निकालने के लिए धन्यवाद। मैंने थोड़ी देर में ओपनसीएल का उपयोग नहीं किया है, और मेरे पास अब परीक्षण करने का कोई आसान तरीका नहीं है, लेकिन आपका जवाब सराहनीय लगता है इसलिए मैं इसे स्वीकार करूँगा। – matth

2

कई संबंधित प्रश्न और उदाहरण

  • यहाँ
  • एक और शुद्ध OpenGL mulitiple gpu सवाल
  • एक producer/consumer example कई GPUs का उपयोग कर कई GPUs के बीच साझा प्रसंस्करण के लिए एक शुद्ध ओपन दृष्टिकोण का एक related example है वर्तमान बनाने के लिए कॉल के लिए निर्माता स्रोत फ़ाइल देखें (विंडोज़ विशिष्ट लेकिन प्रवाह डब्ल्यू दिखता है बीमार कहीं और समान हो)। विवरण
  • के लिए glContext देखें

    bool stageProducer::preExecution() 
    { 
     if(!glContext::getInstance().makeCurrent(_rc)) 
     { 
      window::getInstance().messageBoxWithLastError("wglMakeCurrent"); 
      return false; 
     } 
     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _fboID); 
     return true; 
    } 

OpenCL विशिष्ट है, लेकिन इस सवाल का के लिए प्रासंगिक:

"आप queueA (डिवाइस का) पर बफर करने के लिए एक लिखने enqueue तो OpenCL कि डिवाइस के लिए उपयोग करेगा लिखो। हालांकि, यदि आप उसी संदर्भ में क्यूईबीबी (डिवाइसबी) पर बफर का उपयोग करते हैं, तो ओपनसीएल यह पहचान लेगा कि डिवाइस ए का सबसे हालिया डेटा है और इसे इस्तेमाल करने से पहले इसे डिवाइसबी पर ले जाया जाएगा। संक्षेप में, जब तक आप घटनाओं का उपयोग यह सुनिश्चित करने के लिए करें कि कोई भी डिवाइस एक ही समय में उसी स्मृति ऑब्जेक्ट तक पहुंचने का प्रयास नहीं कर रहा है, ओपनसीएल डब्ल्यू बीमार सुनिश्चित करें कि मेमोरी ऑब्जेक्ट के प्रत्येक उपयोग में सबसे हालिया डेटा है, भले ही किस डिवाइस ने आखिरी बार इसका इस्तेमाल किया हो। "

मुझे लगता है कि जब आप उम्मीद के अनुसार जीपीएस कार्यों के बीच समीकरण साझाकरण स्मृति से ओपनजीएल लेते हैं तो मुझे लगता है?

CL_GL_CONTEXT_KHR, (cl_context_properties) glXGetCurrentContext(), CL_GLX_DISPLAY_KHR, (cl_context_properties) glXGetCurrentDisplay(),

कॉल एक नया ओपन संदर्भ के साथ एक नया धागा अंदर से आने के लिए की जरूरत है:

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