Szukaj…


Uwagi

Ta sekcja zawiera przegląd tego, czym jest opencl i dlaczego deweloper może chcieć go użyć.

Powinien również wymieniać wszelkie duże tematy w opencl i zawierać linki do powiązanych tematów. Ponieważ Dokumentacja dla opencl jest nowa, może być konieczne utworzenie początkowych wersji tych pokrewnych tematów.


Opencl to interfejs API, który pozwala gpus, cpus i niektórym innym akceleratorom (jak pcie-fpga) na dobre wykorzystanie obliczeń podobnych do C99, ale z bardzo szeroką zaletą współbieżności. Po zakończeniu instalacji i podstawowej implementacji tylko proste zmiany w łańcuchu jądra (lub jego pliku) automatycznie stosują algorytm do wątków sprzętowych w N.

Deweloper może chcieć go użyć, ponieważ o wiele łatwiej będzie zoptymalizować przestrzeń pamięci lub szybkość niż robić to samo na opengl lub direct-x. Jest także bezpłatny. Współbieżność w obrębie urządzenia jest niejawna, więc nie ma potrzeby jawnego wielowątkowości dla każdego urządzenia. Jednak w przypadku konfiguracji z wieloma urządzeniami nadal potrzebne jest wielowątkowość procesora. Na przykład, gdy 1000 wątków jest wysyłanych do procesora, synchronizacja wątków jest obsługiwana przez sterownik. Po prostu powiedz mu, jak duża powinna być grupa robocza (na przykład 256 połączona z wirtualną pamięcią lokalną) i gdzie są punkty synchronizacji (tylko w razie potrzeby).

Używanie GPU do operacji ogólnego przeznaczenia jest prawie zawsze szybsze niż CPU. Możesz sortować rzeczy szybciej, pomnożyć macierze 10 razy szybciej i pozostawić dołączanie tabel sql w pamięci w „nie” czasie. Każde 200 $ procesora klasy GPU skończy się szybciej w obciążeniu fizycznym (płynem metodą elementów skończonych) niż każde 200 $ procesora. Opencl sprawia, że jest to łatwiejsze i przenośne. Po zakończeniu pracy w języku C # możesz łatwo przejść do implementacji java-opencl przy użyciu tych samych jąder i projektu C ++ (oczywiście przy użyciu JNI z dodatkową kompilacją w C ++).

W przypadku części graficznej nie zawsze musisz wysyłać bufory między procesorem a GPU. Możesz pracować wyłącznie na GPU, używając opcji „interop” w części tworzenia kontekstu. Dzięki interop możesz przygotować geometrie z maksymalną wydajnością GPU. Nie wymaga pci-e dla danych wierzchołków. Wysyłane jest tylko „polecenie”, a praca odbywa się tylko na karcie graficznej. Oznacza to brak obciążenia procesora dla danych. Opencl przygotowuje dane geometryczne, OpenGL je renderuje. Procesor zostaje zwolniony. Na przykład, jeśli pojedynczy wątek procesora może zbudować kulę z wierzchołkami 32x32 w 10000 cyklach, wówczas GPU z opencl może zbudować 20 kulek w 1000 cyklach.


Co to jest OpenCL?

OpenCL to skrót od Open C omputing L anguage. OpenCL to platforma do programowania równoległego na heterogenicznych platformach, zwanych urządzeniami obliczeniowymi , od procesorów przez procesory graficzne do bardziej specjalnych platform, takich jak FPGA. OpenCL zapewnia standardowy interfejs do obliczeń równoległych na tych urządzeniach obliczeniowych, ale także równoległość między urządzeniami. Określa język programowania oparty na C99 i minimalne wymagania podstawowych funkcji zaimplementowanych na urządzeniach obsługujących OpenCL. Ponadto OpenCL opisuje abstrakcyjny model obliczeniowy i model pamięci, który jest tak ogólny, jak to tylko możliwe, aby ponowne wykorzystanie kodu między różnymi platformami było proste.

Wymagania wstępne

Jeśli posiadasz nowoczesny procesor lub kartę graficzną (GPU) wewnątrz swojego komputera, istnieje duże prawdopodobieństwo, że masz wszystko gotowe na pierwsze kroki w OpenCL. Sprawdzanie, czy Twój procesor obsługuje OpenCL, zwykle można wykonać na stronie głównej producenta, dobrym początkiem jest oficjalna dokumentacja na

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

Co to jest OpenCL?

Open Computing Language (OpenCL) to platforma do pisania programów, które działają na procesorach, procesorach graficznych i innych równoległych procesorach i akceleratorach.

OpenCL określa język programowania (oparty na C), który zapewnia dostęp do nazwanej pamięci wbudowanej, model równoległego wykonywania zadań oraz możliwość synchronizacji tych zadań.

Implementacja C # OpenCL 1.2: liczba platform dla systemu AMD w 64-bitowych oknach

OpenCL to interfejs API niskiego poziomu, dlatego najpierw należy go zaimplementować w „przestrzeni C”. W tym celu należy pobrać pliki nagłówkowe ze strony Khronos. Mój sprzęt to AMD i można go pobrać w wersji 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

z tej strony

powinno wystarczyć dla powiązań C ++, więc po dodaniu tych plików do projektu i ustawieniu odpowiednich lokalizacji plików binarnych (i bibliotecznych) (

$ (AMDAPPSDKROOT) \ lib \ x86_64 dla 64-bitowej biblioteki amd (preferowane są biblioteki sdk aplikacji)

,

C: \ Windows \ SysWOW64 dla 64-bitowego pliku opencl.dll (plik .so, jeśli ICD jest systemem Linux)

na przykład, ale inaczej dla Intel-Nvidia), możesz rozpocząć przeszukiwanie listy platform (amd, intel, xilinx, nvidia) po zainstalowaniu odpowiednich sterowników (takich jak crimson dla amd). Sterowniki służą do uruchamiania aplikacji OpenCl (przy użyciu ICD), biblioteki i pliki nagłówków są w skrócie programowane.

Aby wysłać zapytanie o platformy:

#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;
        }


    }

może być wbudowany w bibliotekę DLL (taką jak OCLImplementation.dll)

i używać go od strony 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);
    }
}

oczywiście dll musi być widziany przez projekt C #, po prostu umieszczenie go w pobliżu pliku wykonywalnego projektu rozwiązuje go.

Teraz, jeśli przykładowy komputer ma co najmniej jedną platformę obsługującą OpenCl,

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

Zmienna totalPlatforms musi mieć co najmniej wartość „1”. Następnie możesz użyć zmiennych platform w przestrzeni C, używając dodatkowych funkcji do iteracji po wszystkich platformach w celu zapytania wszystkich urządzeń, takich jak CPU, GPU i akceleratory specjalnego przeznaczenia, takie jak phi lub niektóre FPGA.

Nie wystarczy napisać wszystkie te C ++ do owijarek C # dla projektów o krytycznym czasie. Istnieje wiele opakowań napisanych dla C #, Java i innych języków. W przypadku java istnieje „Aparapi”, czyli „java bytecode to opencl-c” api konwertera, który przenosi to, co piszesz w Javie do równoległej wersji GPU, dzięki czemu jest nieco przenośny.

OpenCL i C #

Dla C # istnieje wiele opakowań, które oferują interfejs do komunikacji z OpenCL.

  • OpenCL.NET: Jest to jeden z najbardziej owijarek niskiego poziomu. Oferuje pełną implementację OpenCL API dla C # bez dodawania jakiejkolwiek abstrakcji. Tak więc przykłady C \ C ++ można łatwo przenieść do tej biblioteki. Jedyna strona projektu znajduje się obecnie w codeplex, co wyłącza się 15.12.2017, ale pakiet jest dostępny na NuGet

https://openclnet.codeplex.com/

  • NOpenCL: Ta biblioteka oferuje abstrakcyjny interfejs między C # i OpenCL.

Celem krótkoterminowym jest zapewnienie łatwej w użyciu warstwy abstrakcyjnej, która zapewnia dostęp do pełnej funkcjonalności OpenCL bez poświęcania wydajności.

https://github.com/tunnelvisionlabs/NOpenCL

  • Cloo:

Cloo to otwarta, łatwa w użyciu, zarządzana biblioteka, która umożliwia aplikacjom .NET / Mono pełne wykorzystanie frameworku OpenCL.

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



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow