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两种取值(可能之后会有更高的?不知道)