#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#include <iostream>
#define N 10
//正如下面所说,10个核函数的副本并行执行,那么怎么知道是哪一个核函数在运行呢?
//答案就时变量--blockIdx.x--这是一个内置变量--block ID x
//CUDA支持二维的线程块数组
__global__ void add(int *a , int *b , int* c)
{
int tid = blockIdx.x; //计算该索引处的数据.//获得N个线程块的0到N-1的索引
if( tid < N)
c[ tid ] = a[ tid ] + b[ tid ];
}
int main()
{
int a[N] , b[N] , c[N];
int *dev_a, *dev_b , *dev_c;
//在GPU上分配内存
cudaMalloc( (void**)&dev_a , N * sizeof(int ) );
cudaMalloc( (void**)&dev_b , N * sizeof(int ) );
cudaMalloc( (void**)&dev_c , N * sizeof(int ) );
//在CPU上为数组a,b赋初值
for(int i = 0; i < N; i++)
{
a[i] = -i;
b[i] = i * i;
c[i] = 14;
}
//将数组a, b 复制到GPU上去计算
cudaMemcpy( dev_a , a , N * sizeof(int) , cudaMemcpyHostToDevice);
cudaMemcpy( dev_b , b , N * sizeof(int) , cudaMemcpyHostToDevice);
//计算
//第一个参数 N 表示设备执行该函数时使用的并行线程块的数量,这里当然设置为N
//a[0] a[1] a[2].....a[9]
// + + + +
//b[0] b[2] b[2].... b[9]
//可以认为运行时将产生10个核函数的副本并且以并行的方式来执行它们
//每个并行执行的环境称为BLOCK
//并行线程块集合也称为一个Grid
//注意,数组每一维的最大数量不要超过65535,这是硬件限制
//1代表一个一维的Gird,所以下面这句话就是说我们需要个一维的Grid,其中包含N个线程块
add<<<N,1>>>( dev_a , dev_b , dev_c);
//计算完毕,将数组C从GPU复制到CPU
cudaMemcpy( c , dev_c , N * sizeof(int) , cudaMemcpyDeviceToHost);
//显示结果
for(int i = 0; i < N ; i++)
{
printf(" %d + %d = %d \n", a[i] , b[i] , c[i]);
}
//最后记得释放在GPU上分配的内存
cudaFree( dev_a );
cudaFree( dev_b );
cudaFree( dev_c );
getchar();
return 0;
}
CUDA-CODE4-并行编程-blockIDx
最新推荐文章于 2024-05-13 13:45:12 发布