खोज…


टिप्पणियों

यह अनुभाग इस बात का अवलोकन प्रदान करता है कि opencl क्या है, और क्यों एक डेवलपर इसका उपयोग करना चाहता है।

यह भी opencl के भीतर किसी भी बड़े विषयों का उल्लेख करना चाहिए, और संबंधित विषयों के लिए लिंक करना चाहिए। चूंकि opencl के लिए दस्तावेज़ीकरण नया है, इसलिए आपको उन संबंधित विषयों के प्रारंभिक संस्करण बनाने की आवश्यकता हो सकती है।


Opencl एक एपी है जो G99, cpus और कुछ अन्य एक्सेलेरेटर (जैसे pcie-fpga) को C99 जैसी संगणनाओं के अच्छे उपयोग में डालता है, लेकिन एक बहुत व्यापक संगामिति लाभ के साथ। एक बार इंस्टॉलेशन और बेसिक इंप्लीमेंटेशन हो जाने के बाद, कर्नेल स्ट्रिंग (या इसकी फाइल) में केवल साधारण परिवर्तन एन हार्डवेयर थ्रेड्स के लिए स्वचालित रूप से एक एल्गोरिथ्म लागू होता है।

एक डेवलपर इसका उपयोग करना चाह सकता है क्योंकि ओपेंग्ल या डायरेक्ट-एक्स पर एक ही काम करने की तुलना में मेमोरी स्पेस या गति के लिए अनुकूलन करना बहुत आसान होगा। साथ ही यह रॉयल्टी-फ्री है। डिवाइस के भीतर कंसीमेन्ट निहित है, इसलिए प्रत्येक डिवाइस के लिए स्पष्ट मल्टी-थ्रेडिंग की कोई आवश्यकता नहीं है। लेकिन मल्टी-डिवाइस कॉन्फ़िगरेशन के लिए, अभी भी एक सीपीयू-मल्टी-थ्रेडिंग की आवश्यकता है। उदाहरण के लिए, जब 1000 थ्रेडेड जॉब को एक सीपीयू के लिए भेजा जाता है, तो थ्रेड सिंक्रोनाइज़ेशन को ड्राइवर द्वारा नियंत्रित किया जाता है। आप बस इसे बताएं कि एक कार्यसमूह कितना बड़ा होना चाहिए (जैसे कि 256 प्रत्येक स्थानीय स्थानीय मेमोरी से जुड़ा हुआ है) और जहां सिंक्रनाइज़ेशन पॉइंट हैं (केवल जब आवश्यक हो)।

सामान्य प्रयोजन के संचालन के लिए gpu का उपयोग करना लगभग हमेशा cpu की तुलना में तेज़ होता है। आप चीजों को जल्दी से सॉर्ट कर सकते हैं, 10x तेजी से गुणा कर सकते हैं और "नहीं" समय में इन-मेमोरी sql टेबल से जुड़ सकते हैं। कोई भी $ 200 डेस्कटॉप-ग्रेड gpu किसी भी $ 200 cpu की तुलना में भौतिकी (परिमित-तत्व-विधि द्रव) कार्यभार में तेजी से समाप्त होगा। Opencl इसे आसान और पोर्टेबल बनाता है। जब आप C # में काम कर रहे होते हैं, तो आप आसानी से एक ही गुठली और C ++ प्रोजेक्ट (अतिरिक्त C ++ संकलन के साथ JNI का उपयोग करते हुए संभोग) का उपयोग करके java-opencl कार्यान्वयन पर जा सकते हैं।

ग्राफिक्स भाग के लिए, आपको हमेशा सीपीयू और जीपीयू के बीच बफ़र्स नहीं भेजना होगा। आप संदर्भ निर्माण भाग में "इंटरॉप" विकल्प का उपयोग करके विशुद्ध रूप से जीपीयू पर काम कर सकते हैं। इंटरॉप के साथ, आप जीपीयू के सीमा प्रदर्शन पर ज्यामितीय तैयार कर सकते हैं। किसी भी शीर्ष डेटा के लिए कोई pci-e आवश्यक नहीं है। बस एक "कमांड" के माध्यम से भेजा जाता है, और काम ग्राफिक्स कार्ड के अंदर ही किया जाता है। इसका मतलब डेटा के लिए कोई सीपीयू-ओवरहेड नहीं है। Opencl ज्यामिति डेटा तैयार करता है, opengl इसे प्रस्तुत करता है। सीपीयू जारी हो गया। उदाहरण के लिए, यदि cpu का एक भी धागा 10000 चक्रों में 32x32 लंबवत क्षेत्र का निर्माण कर सकता है, तो opencl वाला gpu 1000 चक्रों में 20 गोले बना सकता है।


OpenCL क्या है?

ओपन सी ओप्यूटिंग एल एंगेज के लिए ओपनसीएल छोटा है। ओपनसीएल विषम प्लेटफार्मों के समानांतर प्रोग्रामिंग के लिए एक फ्रेमवर्क है, जिसे कंप्यूट डिवाइस कहा जाता है , सीपीयू से लेकर एफपीजीए जैसे अधिक विशेष प्लेटफार्मों तक। OpenCL इन कम्प्यूट उपकरणों पर समानांतर कंप्यूटिंग के लिए एक मानक इंटरफ़ेस प्रदान करता है, लेकिन इंटर-डिवाइस समानांतरवाद भी। यह C99, और OpenCL सक्षम उपकरणों पर लागू बुनियादी कार्यों की न्यूनतम आवश्यकताओं के आधार पर एक प्रोग्रामिंग भाषा को निर्दिष्ट करता है। OpenCL इसके अलावा एक अमूर्त कंप्यूटिंग और मेमोरी मॉडल का वर्णन करता है, विभिन्न प्लेटफार्मों के बीच कोड का पुन: उपयोग करने के लिए सामान्य रूप से संभव है।

आवश्यक शर्तें

यदि आपके पास अपनी मशीन के अंदर एक आधुनिक सीपीयू या ग्राफिक्स कार्ड (जीपीयू) है, तो संभावना है कि आपके पास ओपनसीएल में पहले चरण के लिए सब कुछ तैयार है। यह पता लगाना कि क्या आपका प्रोसेसर ओपनसीएल सक्षम है आमतौर पर निर्माता के होमपेज के माध्यम से किया जा सकता है, एक अच्छी पहली शुरुआत आधिकारिक दस्तावेज है

https://www.khronos.org/conformance/adopters/conformant-products#opencl

OpenCL क्या है?

ओपन कम्प्यूटिंग लैंग्वेज (OpenCL) सीपीयू, जीपीयू और अन्य समानांतर प्रोसेसर और एक्सेलेरेटर पर निष्पादित होने वाले कार्यक्रमों को लिखने के लिए एक रूपरेखा है।

ओपनसीएल एक प्रोग्रामिंग भाषा (सी पर आधारित) निर्दिष्ट करता है जो ऑन-चिप मेमोरी, नामित समानांतर में कार्यों को निष्पादित करने के लिए एक मॉडल और उन कार्यों को सिंक्रनाइज़ करने की क्षमता प्रदान करता है।

OpenCL 1.2 का C # कार्यान्वयन: 64-बिट विंडो में AMD सिस्टम के लिए प्लेटफार्मों की संख्या

ओपनसीएल निम्न स्तर की एपीआई है इसलिए इसे पहले "सी स्पेस" में लागू किया जाना चाहिए। उसके लिए, किसी को खरोनास साइट से हेडर फ़ाइलों को डाउनलोड करना होगा। मेरा हार्डवेयर AMD है और डाउनलोड करने में 1.2 संस्करण में सक्षम है

opencl.h 
cl_platform.h 
cl.h 
cl_ext.h 
cl_egl.h 
cl_dx9_media_sharing.h 
cl_d3d10.h 
cl_d3d11.h 
cl_gl.h 
cl_gl_ext.h 
cl.hpp

इस पेज से

C ++ बाइंडिंग के लिए पर्याप्त होना चाहिए ताकि इन फ़ाइलों को आपकी परियोजना में जोड़ने के बाद और उचित बाइनरी (और लाइब्रेरी) फ़ाइल स्थान सेट करें (

$ 64 (AMDAPPSDKROOT) 64-बिट amd लाइब्रेरी के लिए \ lib \ x86_64 (amd ऐप sdk की लाइब्रेरी को प्राथमिकता दी जाती है)

,

C: \ Windows \ SysWOW64 के लिए 64-बिट opencl.dll (.so फ़ाइल यदि ICD लिनक्स डिवाइस की है)

उदाहरण के लिए, लेकिन इंटेल-एनवीडिया के लिए अलग), आप उचित ड्राइवरों (जैसे amd के लिए क्रिमसन) को स्थापित करने के बाद प्लेटफार्मों (एएमडी, इंटेल, xilinx, एनवीडिया) की एक सूची को क्वेरी करना शुरू कर सकते हैं। ड्राइवर opencl एप्लिकेशन (ICD का उपयोग करके) चलाने के लिए हैं, लाइब्रेरी और हेडर फाइलें विकास के लिए संक्षिप्त हैं।

प्लेटफार्मों को क्वेरी करने के लिए:

#define __CL_ENABLE_EXCEPTIONS
#include "stdafx.h"
#include <vector>
#include <CL/cl.hpp>

extern "C"
    {
       // when this class is created, it contains a list of platforms in "platforms" field.
       class OpenClPlatformList
       {
           public:
               std::vector<cl::Platform> platforms;
               int platformNum;
               OpenClPlatformList()
               {
                   platforms= std::vector< cl::Platform>();
                   cl::Platform::get(&platforms);
                   platformNum= platforms.size();
               }
        };


        // this is seen from C# when imported. Creates an object in memory.
        __declspec(dllexport)
            OpenClPlatformList * createPlatformList()
        {
            return new OpenClPlatformList();
        }

        __declspec(dllexport)
            int platformNumber(OpenClPlatformList * hList)
        {
            return hList->platformNum;
        }


        __declspec(dllexport)
            void deletePlatformList(OpenClPlatformList * p)
        {
            if (p != NULL)
                delete p;
            p = NULL;
        }


    }

एक dll में बनाया जा सकता है (जैसे OCLImplementation.dll)

और इसे C # की ओर से उपयोग करने के लिए,

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;


namespace WrapperCSharp
{
    public class WrapperCSharp
    {
        [DllImport("OCLImplementation", CallingConvention = CallingConvention.Cdecl)]
        private static extern IntPtr createPlatformList();

        [DllImport("OCLImplementation", CallingConvention = CallingConvention.Cdecl)]
        private static extern int platformNumber(IntPtr hList);

        [DllImport("OCLImplementation", CallingConvention = CallingConvention.Cdecl)]
        private static extern void deletePlatformList(IntPtr hList);
    }
}

टोलकोर्स को सी # प्रोजेक्ट द्वारा देखा जाना चाहिए, बस इसे प्रोजेक्ट के निष्पादन योग्य के पास डालकर हल करता है।

अब, यदि नमूना कंप्यूटर में कम से कम एक opencl- सक्षम प्लेटफ़ॉर्म है,

IntPtr platformList = createPlatformList(); // just an address in C-space
int totalPlatforms = platformNumber(platformList); // AMD+NVIDIA systems should have "2"
deletePlatformList(platformList); //

TotalPlatforms चर का कम से कम "1" मान होना चाहिए। फिर आप सभी प्लेटफार्मों जैसे सीपीयू, जीपीयू और विशेष प्रयोजन त्वरक जैसे कि फी या कुछ fpga को क्वेरी करने के लिए सभी प्लेटफार्मों के माध्यम से पुनरावृति करने के लिए अतिरिक्त फ़ंक्शंस का उपयोग करके सी-स्पेस में प्लेटफ़ॉर्म चर का उपयोग कर सकते हैं।

एक समय-महत्वपूर्ण परियोजनाओं के लिए इन सभी C ++ को C # रैपर तक नहीं लिखा जाता है। सी #, जावा और अन्य भाषाओं के लिए कई रैपर लिखे गए हैं। जावा के लिए, "अपरापी" है जो कि ओपेल्ल-सी "कन्वर्टर एपी" के लिए "जावा बायटेकोड" है, जो कि आप जावा में शुद्ध रूप से मक्खी पर एक जीपीयू-समानांतर संस्करण में लिखते हैं, इसलिए यह कुछ हद तक पोर्टेबल है।

OpenCL और C #

C # के लिए कई रैपर मौजूद हैं जो OpenCL के साथ संवाद करने के लिए एक इंटरफ़ेस प्रदान करते हैं।

  • OpenCL.NET: यह सबसे निम्न स्तर के रैपरों में से एक है। यह सी # के लिए ओपनसीएल एपीआई का पूर्ण कार्यान्वयन प्रदान करता है, बिना किसी अमूर्त को जोड़े। इसलिए इस लाइब्रेरी के लिए C \ C ++ उदाहरण आसानी से पोर्ट किए जाते हैं। एकमात्र प्रोजेक्ट पेज वर्तमान में कोडप्लेक्स पर है, जो 15.12.2017 को बंद हो जाता है लेकिन पैकेज नुगेट पर उपलब्ध है

https://openclnet.codeplex.com/

  • एनओपीसीएल: यह लाइब्रेरी C # और OpenCL के बीच एक सार इंटरफेस प्रदान करती है।

अल्पकालिक लक्ष्य एक आसान-से-सार सार परत प्रदान कर रहा है जो प्रदर्शन का त्याग किए बिना ओपनसीएल की पूर्ण क्षमता तक पहुंच प्रदान करता है।

https://github.com/tunnelvisionlabs/NOpenCL

  • Cloo:

क्लो एक खुला स्रोत है, जिसका उपयोग करना आसान है, प्रबंधित पुस्तकालय जो .NETCL / मोनो अनुप्रयोगों को OpenCL ढांचे का पूरा लाभ उठाने में सक्षम बनाता है।

https://sourceforge.net/projects/cloo/



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow