CUDA编程实现矩阵的相加

        块的大小为128*128;线程的大小的32*32。

 图片来自【CUDA 基础】2.3 组织并行线程 | 谭升的博客


#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include<iostream>

using namespace std;

__global__ void add(float* a, float* b, float* c, int x, int y)
{
	int ix = threadIdx.x + blockIdx.x * blockDim.x;
	int iy = threadIdx.y + blockIdx.y * blockDim.y;
	int idx = ix + x * iy;
	if (ix < x && iy < y)
	{
		c[idx] = a[idx] + b[idx];
	}
}

int main()
{
	int dx = 1 << 12;
	int dy = 1 << 12;
	//进行线程配置
	dim3 block_0(32, 32);
	dim3 grid_0((dx - 1) / block_0.x + 1, (dy - 1) / block_0.y + 1);
	float* a, * b, * c;
	int nbyte = dx * dy * sizeof(float);
	//分配内存空间
	cudaMallocManaged((void**)&a, nbyte);
	cudaMallocManaged((void**)&b, nbyte);
	cudaMallocManaged((void**)&c, nbyte);
	//初始化矩阵
	for (int i = 0; i < dx; i++)
	{
		for (int j = 0; j < dy; j++)
		{
			a[i+j*dx] = 10;
			b[i+j*dx] = 20;
		}
	}
	//调用gpu函数
	cout << "开始调用gpu函数" << endl;
	add << <grid_0, block_0 >> > (a, b, c, dx, dy);
	cudaDeviceSynchronize();
	//cout << "c[20]=" << c[1] << endl;
	cout << c[32] << endl;
	cout << "运行结束" << endl;
	cudaFree(a);
	cudaFree(b);
	cudaFree(c);
	return 0;
}

程序运行结果:

 需要注意的地方:这里为了将二维数组作为函数参数,使用了一维数组代替二维数组。然后调用gpu函数之后,一定要等gpu程序运行结束以后,在进行访问,否则会出现访问错误。


版权声明:本文为ZHLY0307原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。