[GPU]1.并行执行的思路——内核函数

时间:2024-03-14 14:28:50

CUDA编程使用的是类似于C语言的语法

不同于串行计算的函数内循环执行,并行计算使用的是内核函数,每个线程执行单个内核函数,来达到多次执行的效果

比如说,串行执行可能类似于:

void hello()
{
    for(int i=0; i<15; i++){
        printf("hello\n");
    }
}

而对应的并行执行的内核函数是:

__global__ void hello()
{
    printf("hello\n");
}

注意__global__关键字,该关键字指定函数为核函数,并交由GPU并行执行

当然,调用该函数的方式也有所不同。我们来看串行执行时的整个程序:

void hello()
{
    for(int i=0; i<15; i++){
        printf("hello\n");
    }
}

int main(int argc, char** argv)
{
    hello();
    return 0;
}

相信我们都熟悉了如何调用一个串行执行的程序

其对应的并行执行程序调用方是:

#define NUM_BLOCKS 1
#define BLOCK_WIDTH 16

__global__ void hello()
{
    printf("hello\n");
}

int main(int argc, char** argv)
{
    hello<<<NUM_BLOCKS, BLOCK_WIDTH>>>();
    cudaDeviceSynchronize();
    return 0;
}

可以看到调用方式有差距,其中包含两个参数:

  • NUM_BLOCKS,即第一个参数,代表了需要多少个BLOCKS
  • BLOCK_WIDTH,第二个参数,代表每个BLOCK里面有多少个thread(线程)

总共的线程数即NUM_BLOCKS*BLOCK_WIDTH,注意BLOCK_WIDTH存在最大值,根据设备的不同,有512和1024两种取值(可能之后会有更高的?不知道)

相关文章