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}}
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]]
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