OpenCL Grundlagen

  • Published on
    17-Jun-2015

  • View
    2.496

  • Download
    3

Embed Size (px)

DESCRIPTION

http://fg-informatik.unibas.ch/wiki/index.php/OpenCL_Grundlagen

Transcript

<ul><li> 1. OpenCL Data Parallel Language Parallel Computing auf CPU, GPU und CellEin FG Workshop von Christopher Scherb</li></ul> <p> 2. InhaltWas bedeutet Data Parallel?Was ist ein Streamprozessor?Was ist OpenCL?Wie programmiert man OpenCL?Grenzen?Beispiele 3. Was bedeutet Data Parallel? Verarbeitung von Daten zur gleichen Zeit Multicore CPU SSE bzw. SIMD Streamprozessor GPU for (int i = 0; i &lt; #pragma omp parallel datasize; i++)num_threads(datasize) { { data[i] = data[i] + int i = omp_get_thread_num(); 1;data[i] = data[i] + 1; } } 4. Was ist ein Streamprozessor?CO ProzessorViele kleine StreamprozessorenZur Verarbeitung von DatenstrmenHohe ParallelittGPU? 5. Was ist OpenCL?Data/Task Parallel LanguageFr CPUs, GPUs, Cell und DSPsVon Apple entwickeltVerwaltet von der Khronos GroupProgrammiert wird in OpenCL C 6. Plattform Model 7. Plattform ModelHost = System Prozessor (CPU)Compute Device = CPU / GPU / CellCompute Unit = SIMD EinheitProzessing Element = ALU desCompute Devices 8. Speichermodel 9. Speichermodel Host Memory = System Memory Global Memory = fr alle Compute Units Local Memory = fr eine SIMD Einheit Private Memory = fr eine ALU Nur Local Memory kann synchronisiertwerden! 10. Ausfhrmodel Verarbeite jedes Element einzeln Verteile auf verschiedene Compute Units SIMD wird nicht genutzt Fasse bestimmte Anzahl der Elemente zuBlcken zusammen SIMD Verteile mehrere Blcke ber die Compute Units Synchronisierung 11. Ausfhrmodel 12. Wie programmiert man OpenCL? Host (System) initialisiert das OpenCL Device Host erstellt und compiliert ein OpenCLProgramm Host erstellt Kernel (= ausfhrbarer Code) Host schreibt Daten auf das Device Device verarbeitet Daten Host liest Daten zurck 13. Initialiesiere OpenCL Device Whle eine Platform (= SDK) Lese Context Einstellungen aus Platform Erstelle Context Initialisiere Platform:cl_uint numPlatforms;cl_platform_id platform = NULL;clGetPlatformIDs(0, NULL,&amp;numPlatforms); 14. Platform auswhlenif (0 &lt; numPlatforms){ cl_platform_id* platforms = new cl_platform_id[numPlatforms]; clGetPlatformIDs(numPlatforms, platforms, NULL); for (unsigned i = 0; i &lt; numPlatforms; ++i){char pbuf[100];clGetPlatformInfo(platforms[i],CL_PLATFORM_VENDOR,sizeof(pbuf),pbuf,NULL);platform = platforms[i];if (!strcmp(pbuf, "Advanced Micro Devices, Inc."))break;}delete[] platforms;}cl_context_properties cps[3] ={CL_CONTEXT_PLATFORM,(cl_context_properties)platform,0};cl_context_properties* cprops =(platform==NULL) ? NULL : cps; 15. Context erstellencl_context hContext;hContext=clCreateContextFromType(cprops,CL_DEVICE_TYPE_GPU,0,0, &amp;error); errcheck(error,"clCreateContextFromType");Errorcheck Funktion (Sollte nach jeden Verweis auferror aufgerufen werden):void errcheck(int error, std::string error_code){if(error != CL_SUCCESS){ std::cout</p>

Recommended

View more >