CUDA-CODE5-并行编程(1)

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#include <iostream>

#define N 10

//不再使用线程块block,这里改为使用线程协作的方式来完成矢量求和
__global__ void  add(int *a , int *b , int* c)
{
	//int tid = blockIdx.x;	//计算该索引处的数据.//获得N个线程块的0到N-1的索引
	//索引的方式也产生了变化
	int tid = threadIdx.x;//获得线程索引
	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);
	//1代表一个一维的Gird,所以下面这句话就是说我们需要个一维的Grid,其中包含N个线程块
	//add<<<N,1>>>( dev_a , dev_b , dev_c);
	//--------------------------------------------------
	//上面是线程块的执行方法,现在改为使用线程并行执行
	add<<<1,N>>>( 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;
}
/*
	使用线程与使用线程块相比存在哪些优势呢?几乎没有任何优势,
	但是,线程块中的并行线程能够完成线程块无法完成的工作。
*/


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值