Muokataan sivua OpenCL

Siirry navigaatioon Siirry hakuun
Varoitus: Et ole kirjautunut sisään. IP-osoitteesi näkyy julkisesti kaikille, jos muokkaat. Jos kirjaudut sisään tai luot tunnuksen, muokkauksesi yhdistetään käyttäjänimeesi ja saat paremman käyttökokemuksen.

Kumoaminen voidaan suorittaa. Varmista alla olevasta vertailusta, että haluat saada aikaan tämän lopputuloksen, ja sen jälkeen julkaise alla näkyvät muutokset.

Nykyinen versio Oma tekstisi
Rivi 1: Rivi 1:
{{Perustietoa|en: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.
'''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.
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==
= 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 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);
    }
}


int main()
= OpenCL-ympäristö Fedora 20 -jakeluun =
{
    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);
    }
 
    return 0;
}
</syntaxhighlight>
 
==Jakelukohtaista==
===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ö====
== Intelin OpenCL-ympäristö ==


Seuraavaksi tarvitaan pari pakettia riippuvuuksien vuoksi
Seuraavaksi tarvitaan pari pakettia riippuvuuksien vuoksi
Rivi 90: Rivi 84:
  Alustan 0 laite 0 toimii.
  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
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
  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
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.1 1
  VBoxManage setextradata <vkoneen-nimi> VBoxInternal/CPUM/SSE4.2 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.
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-ympäristö ==


NVIDIAn OpenCL-tuen saat käyttöön [[RPM Fusion]] -pakettivarastosta komennolla
NVidian OpenCL-tuen saat käyttöön [[RPM Fusion]] -pakettivarastosta komennolla


  yum install kmod-nvidia
  yum install kmod-nvidia
Rivi 109: Rivi 103:
Koneen uudelleenkäynnistäminen varmistaa moduulin asentumisen.
Koneen uudelleenkäynnistäminen varmistaa moduulin asentumisen.


{{Ohjelmointikielet}}
[[Luokka:Laitteisto]]
[[Luokka:Laitteisto]]
[[Luokka:Ohjeet]]
[[Luokka:Ohjeet]]
[[Luokka:X]]
[[Luokka:X]]
Wikin materiaali on kaikkien vapaasti käytettävissä Creative Commons 3.0 - nimi mainittava -lisenssin alaisuudessa. TEKIJÄNOIKEUDEN ALAISEN MATERIAALIN KÄYTTÄMINEN ILMAN LUPAA ON EHDOTTOMASTI KIELLETTYÄ!

Muokataksesi tätä sivua vastaa alla olevaan kysymykseen (lisätietoja):

Peruuta Muokkausohjeet (avautuu uuteen ikkunaan)
Noudettu kohteesta ”https://www.linux.fi/wiki/OpenCL