Ero sivun ”OpenCL” versioiden välillä

Linux.fista
Siirry navigaatioon Siirry hakuun
p (nvidia)
 
(11 välissä olevaa versiota 6 käyttäjän tekeminä ei näytetä)
Rivi 1: Rivi 1:
Tämä sivu on kesken.
{{Perustietoa|en:OpenCL}}
'''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]].


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.
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.


= 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>


#include <stdio.h>
<syntaxhighlight lang="c">
#include <stdlib.h>
#include <stdio.h>
#include <CL/cl.h>
#include <stdlib.h>
#include <CL/cl.h>
int main()
 
{
int main()
    int i;
{
    cl_int ret;
    int i;
    cl_int ret;
    // Haetaan alustat (enintään 10).
 
    cl_uint alusta_lkm;
    // Haetaan alustat (enintään 10).
    cl_platform_id alusta_id[10];
    cl_uint alusta_lkm;
    ret = clGetPlatformIDs(10, alusta_id, &alusta_lkm);
    cl_platform_id alusta_id[10];
    if (ret != CL_SUCCESS) {
    ret = clGetPlatformIDs(10, alusta_id, &alusta_lkm);
        printf("clGetPlatformIDs epäonnistui.\n");
    if (ret != CL_SUCCESS) {
        exit(1);
        printf("clGetPlatformIDs epäonnistui.\n");
    }
        exit(1);
    // Haetaan alustojen valmistajien nimet (max. 1000 merkkiä)
    }
    printf("clGetPlatformIDs löysi %i alustaa.\n", alusta_lkm);
    // Haetaan alustojen valmistajien nimet (max. 1000 merkkiä)
    for (i=0; i<alusta_lkm; i++) {
    printf("clGetPlatformIDs löysi %i alustaa.\n", alusta_lkm);
        char tmp[1000];
    for (i=0; i<alusta_lkm; i++) {
        clGetPlatformInfo(alusta_id[i], CL_PLATFORM_VENDOR, 1000, tmp, NULL);
        char tmp[1000];
        printf("Alustan %i toimittaja on %s.\n", i, tmp);
        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 =
    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ö====


Seuraavaksi tarvitaan pari pakettia riippuvuuksien vuoksi
Seuraavaksi tarvitaan pari pakettia riippuvuuksien vuoksi
Rivi 54: Rivi 84:
  ./hae-alustat
  ./hae-alustat


tulostaa
tulostaa esimerkiksi


clGetPlatformIDs löysi 1 alustaa.
clGetPlatformIDs löysi 1 alustaa.
Alustan 0 toimittaja on Intel(R) Corporation.
Alustan 0 toimittaja on Intel(R) Corporation.
Alustan 0 laite 0 toimii.


NVidian OpenCL-tuen saat käyttöön [[RPM Fusion]] -pakettivarastosta komennolla
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


Boottaamalla koneen voi varmistaa tämän toimivuuden.
Koneen uudelleenkäynnistäminen varmistaa moduulin asentumisen.
 
OpenCL toimii prosessorissa, jossa on vähintään SSE4.1-tuki. Tämän tarkistaa helpoiten komennolla


fgrep sse4_1 /proc/cpuinfo
{{Ohjelmointikielet}}
[[Luokka:Laitteisto]]
[[Luokka:Ohjeet]]
[[Luokka:X]]

Nykyinen versio 10. toukokuuta 2022 kello 15.13

Linux.fi-wikissä artikkelit käsittelevät yleensä aihettaan siltä osin, kuin se koskee Linuxia ja avoimia/vapaita ohjelmistoja. Yleisluontoisemman artikkelin tästä aiheesta löydät tietosanakirja Wikipediasta.

OpenCL on avoin monen valmistajan tukema standardi grafiikkasuoritinten 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 grafiikkasuoritinta. Toisaalta halvin OpenCL:ää tukeva grafiikkasuoritin maksoi vuoden 2014 alussa vain noin 30 euroa.

OpenCL-ympäristön toimivuuden tarkistava ohjelma[muokkaa]

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);
    }

    return 0;
}

Jakelukohtaista[muokkaa]

OpenCL-ympäristö Fedora 20 -jakeluun[muokkaa]

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ö[muokkaa]

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 suorittimen, 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ö[muokkaa]

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

yum install kmod-nvidia

Koneen uudelleenkäynnistäminen varmistaa moduulin asentumisen.

v  k  m
Ohjelmointikielet
 Käännettävät  Assembly | C | C++ | Go | Haxe | Haskell | Java | Pascal
 Tulkattavat  Python | Perl | PHP | Ruby
 -skriptikielet  Lua | Bash
 GPGPU  OpenCL
 muut  GLSL