OpenCL
OpenCL on avoin monen valmistajan tukema standardi GPGPU-ohjelmointiin (engl. 'General-purpose computing on graphics processing units'). Tunnetuin vaihtoehto tälle lienee vain NVidian laitteissa käytettävä CUDA.
Myös tavallisiin suorittimiin saa OpenCL-tuen, jolloin ohjelmointia voi kokeilla ilman GPU:ta. Toisaalta halvin OpenCL:ää tukeva GPU maksoi vuoden 2014 alussa vain noin 30 euroa.
OpenCL-ympäristön toimivuuden tarkistava ohjelma
Seuraava ohjelma tulostaa OpenCL:ää suorittamaan pystyvät alustat. Oletetaan jatkossa tämän koodin olevan nimellä hae-alustat.c
#include <stdio.h> #include <stdlib.h> #include <CL/cl.h> int main() { int i; cl_int ret; // Haetaan alustat (enintään 10). cl_uint alusta_lkm; cl_platform_id alusta_id[10]; ret = clGetPlatformIDs(10, alusta_id, &alusta_lkm); if (ret != CL_SUCCESS) { printf("clGetPlatformIDs epäonnistui.\n"); 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); } // 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); } }
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
yum install opencl-utils-devel
Tämän jälkeen komento
gcc -I/usr/include/opencl-utils/include -c hae-alustat.c
tuottaa tiedoston hae-alustat.o
Intelin OpenCL-ympäristö
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 tar xzf tiedostonnimi.tgz -komennolla. Tuloksena on hakemisto. Aja sen sisältämä install-cpu.sh-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 prosessorin, jossa on vähintään SSE4.1-tuki; testatusti kuitenkin vasta SSE4.2 riittää. Tämän tarkistaa helpoiten komennolla
fgrep sse4_2 /proc/cpuinfo
Virtuaalikoneissa on huomattava, että isäntäkoneen SSE-tuki ei välttämättä näy virtuaalikoneelle. Esimerksi VirtualBoxissa 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 clCreateContext-funktiossa.
NVidian OpenCL-ympäristö
NVidian OpenCL-tuen saat käyttöön RPM Fusion -pakettivarastosta komennolla
yum install kmod-nvidia
Koneen uudelleenkäynnistäminen varmistaa moduulin asentumisen.