Ricerca…


Osservazioni

Questa sezione fornisce una panoramica di ciò che opencl è, e perché uno sviluppatore potrebbe voler usarlo.

Dovrebbe anche menzionare tutti i soggetti di grandi dimensioni all'interno di opencl e collegarsi agli argomenti correlati. Poiché la documentazione di opencl è nuova, potrebbe essere necessario creare versioni iniziali di tali argomenti correlati.


Opencl è un'api che mette gpus, cpus e alcuni altri acceleratori (come un pcie-fpga) in un buon uso di calcoli simili a C99 ma con un vantaggio di concorrenza molto ampio. Una volta che l'installazione e l'implementazione di base sono state fatte, solo le semplici modifiche in una stringa del kernel (o il suo file) applica automaticamente un algoritmo ai thread hardware N.

Uno sviluppatore potrebbe volerlo usare perché sarà molto più facile ottimizzare per spazio di memoria o velocità piuttosto che fare la stessa cosa su opengl o direct-x. Inoltre è esente da royalty. La concorrenza all'interno di un dispositivo è implicita, quindi non è necessario esplicitare il multithreading per ciascun dispositivo. Ma per le configurazioni multi-dispositivo, è ancora necessaria una cpu-multi-threading. Ad esempio, quando un processo con 1000 thread viene inviato a una CPU, la sincronizzazione dei thread viene gestita dal driver. Devi solo dire quanto dovrebbe essere grande un gruppo di lavoro (come 256 ciascuno collegato con la memoria locale virtuale) e dove sono i punti di sincronizzazione (solo quando necessario).

Usare gpu per operazioni generiche è quasi sempre più veloce della cpu. Puoi ordinare le cose più velocemente, moltiplicare le matrici 10 volte più velocemente e lasciare le tabelle sql in memoria in "no". Qualsiasi gpu da 200 $ desktop-desktop finirà più velocemente in un carico di lavoro fisico (fluido a elementi finiti) di qualsiasi 200 $ cpu. Opencl lo rende più facile e portatile. Quando hai finito di lavorare in C #, puoi facilmente passare all'implementazione java-opencl usando gli stessi kernel e il progetto C ++ (naturalmente usando JNI con compilazione C ++ extra).

Per la parte grafica, non è sempre necessario inviare buffer tra cpu e gpu. Puoi lavorare esclusivamente su GPU usando l'opzione "Interop" nella parte di creazione del contesto. Con l'interoperabilità, puoi preparare le geometrie al limite delle prestazioni di gpu. Nessun pci-e richiesto per nessun dato di vertice. Viene inviato solo un "comando" e il lavoro viene eseguito solo all'interno della scheda grafica. Ciò significa non sovraccaricare la CPU per i dati. Opencl prepara i dati di geometria, opengl lo rende. CPU viene rilasciata. Ad esempio, se un singolo thread di CPU può creare una sfera verticale 32x32 in 10000 cicli, allora una gpu con opencl può creare 20 sfere in 1000 cicli.


Cos'è OpenCL?

OpenCL è l'abbreviazione di Open C omputing L anguage. OpenCL è un framework per la programmazione parallela su piattaforme eterogenee, chiamate dispositivi di calcolo , che vanno da CPU su GPU a piattaforme più speciali come FPGA. OpenCL fornisce un'interfaccia standard per il calcolo parallelo su questi dispositivi di calcolo, ma anche il parallelismo tra i dispositivi. Specifica un linguaggio di programmazione, basato su C99, e requisiti minimi delle funzioni di base implementate su dispositivi abilitati OpenCL. OpenCL descrive inoltre un modello astratto di calcolo e memoria, essendo il più generale possibile per rendere semplice il riutilizzo del codice tra diverse piattaforme.

Prerequisiti

Se hai una CPU o una scheda grafica (GPU) moderna nella tua macchina, è probabile che tu abbia tutto pronto per i primi passi in OpenCL. Scoprire se il tuo processore è compatibile con OpenCL può essere fatto solitamente tramite la homepage del produttore, un buon primo avvio è la documentazione ufficiale a

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

Cos'è OpenCL?

Open Computing Language (OpenCL) è un framework per scrivere programmi che vengono eseguiti su CPU, GPU e altri processori e acceleratori paralleli.

OpenCL specifica un linguaggio di programmazione (basato su C) che fornisce accesso alla memoria on-chip denominata, un modello per l'esecuzione di attività in parallelo e la possibilità di sincronizzare tali attività.

Implementazione C # di OpenCL 1.2: numero di piattaforme per un sistema AMD in finestre a 64 bit

OpenCL è api di basso livello quindi deve essere implementato prima in "C space". Per questo, è necessario scaricare i file di intestazione dal sito di Khronos. Il mio hardware è AMD e in grado di scaricare la versione 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

da questa pagina

dovrebbe essere sufficiente per i collegamenti C ++ quindi dopo aver aggiunto questi file al progetto e impostato i percorsi di file binari (e libreria) appropriati (

$ (AMDAPPSDKROOT) \ lib \ x86_64 per la libreria amd a 64 bit (le librerie sdk dell'app amd sono preferite)

,

C: \ Windows \ SysWOW64 per opencl.dll a 64 bit (file .so se ICD è di un sistema Linux)

per esempio, ma diverso per Intel-Nvidia), puoi iniziare a interrogare un elenco di piattaforme (amd, intel, xilinx, nvidia) dopo aver installato i driver appropriati (come ad esempio crimson per amd). I driver sono per l'esecuzione dell'applicazione opencl (utilizzando ICD), le librerie e i file di intestazione sono per lo sviluppo in breve.

Per interrogare le piattaforme:

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


    }

potrebbe essere incorporato in una DLL (come OCLImplementation.dll)

e usarlo dal lato 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);
    }
}

naturalmente la dll deve essere vista dal progetto C #, semplicemente mettendolo vicino all'eseguibile del progetto lo risolve.

Ora, se il computer di esempio ha almeno una piattaforma compatibile con opencl,

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

la variabile totalPlatforms deve avere almeno il valore "1". Quindi è possibile utilizzare le piattaforme variabili in C-space utilizzando funzioni aggiuntive per scorrere tutte le piattaforme per interrogare tutti i dispositivi come CPU, GPU e acceleratori speciali come phi o alcuni fpga.

Non si scrivono semplicemente tutti questi wrapper C ++ in C # per progetti time-critical. Ci sono molti wrapper scritti per C #, Java e altre lingue. Per java, c'è "Aparapi" che è l'API del convertitore "java bytecode to opencl-c" che prende ciò che scrivi puramente in java su una versione gpu-parallela al volo, quindi è un po 'portatile.

OpenCL e C #

Per C # esistono molti wrapper che offrono un'interfaccia per comunicare con OpenCL.

  • OpenCL.NET: questo è uno dei wrapper di livello più basso là fuori. Offre un'implementazione completa dell'API OpenCL per C # senza aggiungere alcuna astrazione. Quindi gli esempi C \ C ++ sono facilmente portati per questa libreria. L'unica pagina del progetto è attualmente in codeplex, che si arresta il 15.12.2017 ma il pacchetto è disponibile su NuGet

https://openclnet.codeplex.com/

  • NOpenCL: questa libreria offre un'interfaccia astratta tra C # e OpenCL.

L'obiettivo a breve termine è fornire un livello astratto di facile utilizzo che fornisce l'accesso a tutte le funzionalità di OpenCL senza sacrificare le prestazioni.

https://github.com/tunnelvisionlabs/NOpenCL

  • Cloo:

Cloo è una libreria gestita open source, facile da usare che consente alle applicazioni .NET / Mono di sfruttare appieno il framework OpenCL.

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



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow