块的大小为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版权协议,转载请附上原文出处链接和本声明。