Skip navigation

Kernel és fordítás

Kernel

A CUDA driver api-ban a kerneleket általában külön fileban írjuk, és külön kezeljük. a következő példaprogramunkban a vektor összeadást nézzük meg egy új környezetben.

Az alábbi kód a 08_1b_matSumKernel.cu file teljes tartalma.

A kód csak egy kernelt tartalmaz. A CPU futó keret ebben az esetben teljesen külön lesz.

// Vector addition (device code)

#include "08_1c_matSumKernel.cuh"

__global__ void matSum(int *a, int *b, int *c)
{
    int tid = blockIdx.x;
    if (tid < N)
        c[tid] = a[tid] + b[tid];
}

A kernelt nem kell sokat nagyarázni, vektorok elemenkénti összeadását oldja meg.

Fejléc a méret definícióval

Előfordulha az is, hogy a kernelnek és a CPU kódnak közös információkra van szüksége. Például konstans definíciókra, amit a 08_1c_matSumKernel.cuh fejléc fileban megadtunk.

#ifndef __MATSUMKERNEL_H
#define __MATSUMKERNEL_H

// size of the vectors to sum
#define N                 100

#endif __MATSUMKERNEL_H

Ebbea fileba viszont, a normál C++ -tól eltérően nem kell beleírni a futtatandó kernel fejlécét.

Fordítás

Ha a kernelünk előállt a forráskódot le kell fordítani az NVCC fordítóval. Erre használhatjuk az alábbi parancssori sort.

nvcc -arch=sm_20 -ptx -o 08_1b_matSumKernel.ptx 08_1b_matSumKernel.cu

Az eredmény a 08_1b_matSumKernel.ptx file lesz, ami a lefordított kódot tartalmazza. Ezt fogjuk betülteni a CPU-n futó keretprogramban.