Nykyinen versio |
Oma tekstisi |
Rivi 1: |
Rivi 1: |
| {{Perustietoa|en:OpenCL}}
| | Tämä sivu on kesken. |
| '''OpenCL''' on avoin monen valmistajan tukema standardi [[wikipedia:fi:Grafiikkasuoritin|grafiikkasuoritinten]] [[wikipedia:fi:GPGPU|GPGPU]]-ohjelmointiin (engl. 'General-purpose computing on graphics processing units'). Tunnetuin vaihtoehto tälle lienee vain [[NVIDIA]]n laitteissa käytettävä [[CUDA]].
| |
|
| |
|
| Myös tavallisiin suorittimiin saa OpenCL-tuen, jolloin ohjelmointia voi kokeilla ilman grafiikkasuoritinta. Toisaalta halvin OpenCL:ää tukeva grafiikkasuoritin maksoi vuoden 2014 alussa vain noin 30 euroa. | | Grafiikkaprosessorien (GPU) käyttöä yleiseen laskentaan, ei välttämättä pelkkään grafiikan tuottamiseen, kutsutaan nimellä GPGPU (engl. 'General-purpose computing on graphics processing units'). GPGPU-ohjelmointiin on useita ohjelmointikieliä, joista OpenCL on avoin monen valmistajan tukema standardi. Sen tunnetuin kilpailija lienee vain NVidian laitteissa käytettävä CUDA. Myös tavallisiin suorittimiin saa OpenCL-tuen, jolloin ohjelmointia voi kokeilla myös ilman GPU:ta. Toisaalta halvin OpenCL:ää tukeva GPU maksoi vuoden 2014 alussa vain noin 30 euroa. |
|
| |
|
| ==OpenCL-ympäristön toimivuuden tarkistava ohjelma==
| | = OpenCL-ympäristön toimivuuden tarkistava ohjelma = |
|
| |
|
| Seuraava ohjelma tulostaa OpenCL:ää suorittamaan pystyvät alustat. Oletetaan jatkossa tämän koodin olevan nimellä <tt>hae-alustat.c</tt> | | Seuraava ohjelma tulostaa OpenCL:ää suorittamaan pystyvät alustat. Oletetaan jatkossa tämän koodin olevan nimellä <tt>hae-alustat.c</tt> |
|
| |
|
| <syntaxhighlight lang="c">
| | #include <stdio.h> |
| #include <stdio.h> | | #include <stdlib.h> |
| #include <stdlib.h> | | #include <CL/cl.h> |
| #include <CL/cl.h> | | |
| | | int main() |
| int main() | | { |
| { | | int i; |
| int i;
| | cl_int ret; |
| cl_int ret;
| | |
| | | // Haetaan alustat (enintään 10). |
| // Haetaan alustat (enintään 10).
| | cl_uint alusta_lkm; |
| cl_uint alusta_lkm;
| | cl_platform_id alusta_id[10]; |
| cl_platform_id alusta_id[10];
| | ret = clGetPlatformIDs(10, alusta_id, &alusta_lkm); |
| ret = clGetPlatformIDs(10, alusta_id, &alusta_lkm);
| | if (ret != CL_SUCCESS) { |
| if (ret != CL_SUCCESS) {
| | printf("clGetPlatformIDs epäonnistui.\n"); |
| printf("clGetPlatformIDs epäonnistui.\n");
| | exit(1); |
| exit(1);
| | } |
| | // Haetaan alustojen valmistajien nimet (max. 1000 merkkiä) |
| | printf("clGetPlatformIDs löysi %i alustaa.\n", alusta_lkm); |
| | for (i=0; i<alusta_lkm; i++) { |
| | char tmp[1000]; |
| | clGetPlatformInfo(alusta_id[i], CL_PLATFORM_VENDOR, 1000, tmp, NULL); |
| | printf("Alustan %i toimittaja on %s.\n", i, tmp); |
| } | | } |
| // Haetaan alustojen valmistajien nimet (max. 1000 merkkiä)
| | } |
| printf("clGetPlatformIDs löysi %i alustaa.\n", alusta_lkm);
| |
| for (i=0; i<alusta_lkm; i++) {
| |
| char tmp[1000];
| |
| clGetPlatformInfo(alusta_id[i], CL_PLATFORM_VENDOR, 1000, tmp, NULL);
| |
| printf("Alustan %i toimittaja on %s.\n", i, tmp);
| |
| }
| |
| // Tarkistetaan alustojen todella toimivan
| |
| cl_uint laite_lkm;
| |
| for (i=0; i<alusta_lkm; i++) {
| |
| cl_device_id laite_id[10];
| |
| ret = clGetDeviceIDs(alusta_id[i], CL_DEVICE_TYPE_ALL, 10,
| |
| laite_id, &laite_lkm);
| |
| if (ret == CL_SUCCESS) {
| |
| printf("Alustalla %i on %i laitetta.\n", i, laite_lkm);
| |
| for (j=0; j<laite_lkm; j++) {
| |
| cl_context kehys = clCreateContext(NULL,
| |
| 1, laite_id+j, NULL, NULL, &ret);
| |
| if (ret == CL_SUCCESS) {
| |
| printf("Alustan %i laite %i toimii.\n", i, j);
| |
| clReleaseContext(kehys);
| |
| }
| |
| else
| |
| printf("clCreateContext epäonnistui laitteelle %i.\n", j);
| |
| }
| |
| }
| |
| else
| |
| printf("clGetDeviceIDs epäonnistui alustalle %i.\n", i);
| |
| }
| |
| | |
| return 0;
| |
| }
| |
| </syntaxhighlight>
| |
|
| |
|
| ==Jakelukohtaista==
| | = OpenCL-ympäristö Fedora 20 -jakeluun = |
| ===OpenCL-ympäristö Fedora 20 -jakeluun===
| |
|
| |
|
| OpenCL-ohjelman kääntämiseen (mutta ei linkittämiseen valmiiksi ohjelmaksi) riittävät OpenCL-otsakkeet. Ne asentuvat komennolla | | OpenCL-ohjelman kääntämiseen (mutta ei linkittämiseen valmiiksi ohjelmaksi) riittävät OpenCL-otsakkeet. Ne asentuvat komennolla |
|
| |
|
| [[yum]] install opencl-utils-devel | | yum install opencl-utils-devel |
|
| |
|
| Tämän jälkeen komento | | Tämän jälkeen komento |
|
| |
|
| [[gcc]] -I/usr/include/opencl-utils/include -c hae-alustat.c | | gcc -I/usr/include/opencl-utils/include -c hae-alustat.c |
|
| |
|
| tuottaa tiedoston <tt>hae-alustat.o</tt> | | tuottaa tiedoston <tt>hae-alustat.o</tt> |
|
| |
|
| ====Intelin OpenCL-ympäristö====
| | NVidian OpenCL-tuen saat käyttöön [[RPM Fusion]] -pakettivarastosta komennolla |
| | |
| Seuraavaksi tarvitaan pari pakettia riippuvuuksien vuoksi
| |
| | |
| yum install lsb-core-amd64 libpng12
| |
| | |
| Lataa osoitteesta http://software.intel.com/en-us/vcsource/tools/opencl-sdk-xe tiedosto "64-bit SDK for Linux". Pura saamasi .tgz -tiedosto normaalisti <tt>tar xzf tiedostonnimi.tgz</tt> -komennolla. Tuloksena on hakemisto. Aja sen sisältämä <tt>install-cpu.sh</tt>-tiedosto. Nyt ohjelman kääntyy ja toimii:
| |
| | |
| gcc -I/usr/include/opencl-utils/include -o hae-alustat hae-alustat.c -lOpenCL
| |
| ./hae-alustat
| |
| | |
| tulostaa esimerkiksi
| |
| | |
| clGetPlatformIDs löysi 1 alustaa.
| |
| Alustan 0 toimittaja on Intel(R) Corporation.
| |
| Alustan 0 laite 0 toimii.
| |
| | |
| OpenCL vaatii Intelin dokumentaation mukaan suorittimen, jossa on vähintään [[wikipedia:fi:SSE|SSE]]4.1-tuki; testatusti kuitenkin vasta SSE4.2 riittää. Tämän tarkistaa helpoiten komennolla
| |
| | |
| [[fgrep]] sse4_2 /proc/cpuinfo
| |
| | |
| [[Virtuaalikone]]issa on huomattava, että isäntäkoneen SSE-tuki ei välttämättä näy virtuaalikoneelle. Esimerksi [[VirtualBox]]issa tämä vaatii vähintään version 4.3.8, jonka lisäksi tuki on erikseen otettava käyttöön komennoilla
| |
| | |
| [[VBoxManage]] setextradata <vkoneen-nimi> VBoxInternal/CPUM/SSE4.1 1
| |
| VBoxManage setextradata <vkoneen-nimi> VBoxInternal/CPUM/SSE4.2 1
| |
| | |
| Riittävän SSE-tuen puuttuessa edelläoleva testiohjelma löytää alustan ja laitteen, mutta epäonnistuu <tt>clCreateContext</tt>-funktiossa.
| |
| | |
| ====NVIDIAn OpenCL-ympäristö====
| |
| | |
| NVIDIAn OpenCL-tuen saat käyttöön [[RPM Fusion]] -pakettivarastosta komennolla
| |
|
| |
|
| yum install kmod-nvidia | | yum install kmod-nvidia |
|
| |
|
| Koneen uudelleenkäynnistäminen varmistaa moduulin asentumisen.
| | Boottaamalla koneen voi varmistaa tämän toimivuuden. |
| | |
| {{Ohjelmointikielet}}
| |
| [[Luokka:Laitteisto]]
| |
| [[Luokka:Ohjeet]]
| |
| [[Luokka:X]]
| |