CUDA-CODE4-并行编程-blockIDx

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值