मुझे ओपनसीएल/ओपनजीएल इंटरऑप के साथ कई जीपीयू का उपयोग करने में परेशानी हो रही है। मैं एक ऐसा एप्लीकेशन लिखने की कोशिश कर रहा हूं जो एक गहन गणना के परिणाम प्रदान करता है। अंत में यह एक अनुकूलन समस्या चलाएगा, और उसके बाद, परिणाम के आधार पर, स्क्रीन पर कुछ प्रस्तुत करें। एक परीक्षण मामले के रूप में, मैं इस पाठ्यक्रम से कण सिमुलेशन उदाहरण कोड से शुरू कर रहा हूं: 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
};
आपकी समस्या का कारण जरूरी नहीं है, लेकिन यदि मैं आपका था तो मैं पहले अपने ड्राइवरों को अपडेट करता था ... उदाहरण के लिए, वे काफी पुराने हैं, उदाहरण के लिए आपके जीटीएक्स 285 के लिए लिनक्स 64 बिट के लिए वर्तमान ड्राइवर संस्करण 319.32 (v बीटा में 325.08)। – CaptainObvious
क्या आपके ओपनसीएल संदर्भ में जीपीयू दोनों शामिल हैं? आपको दो GPUs के बीच डेटा को स्थानांतरित करने के कार्यान्वयन के लिए ऐसा करने की आवश्यकता है ताकि एक जीपीयू के परिणाम दूसरे द्वारा प्रस्तुत किए जा सकें। – chippies
@chippies मुझे OpenCL संदर्भ बनाने का प्रयास करते समय त्रुटि मिल रही है। वहां कोड में, डिवाइस एक सरणी है जिसमें GPUs दोनों शामिल हैं। – matth