#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;
}
/*
使用线程与使用线程块相比存在哪些优势呢?几乎没有任何优势,
但是,线程块中的并行线程能够完成线程块无法完成的工作。
*/
CUDA-CODE5-并行编程(1)
最新推荐文章于 2022-04-08 14:49:45 发布