我是靠谱客的博主 勤奋大象,最近开发中收集的这篇文章主要介绍CUDA矩阵加法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

实现矩阵相加
有可能相关库没有加载上 请自行加载

#include <stdio.h>
#include <iostream>
#include <cuda_runtime.h> // For the CUDA runtime routines (prefixed with "cuda_")
#include <DEVICE_LAUNCH_PARAMETERS.h> //我在查询中找到的头文件 有可能有别的表达方式
//#include <stdio.h>
#define N 1024
#define TPB 16
__global__ void MatAdd(int A[N][N], int B[N][N], int C[N][N])
{

int i = blockIdx.x * blockDim.x + threadIdx.x;

int j = blockIdx.y * blockDim.y + threadIdx.y;

if (i < N && j < N)

C[i][j] = A[i][j] + B[i][j];
}
int a[N][N], b[N][N], c[N][N];
void main()
{

//int a[N][N], b[N][N], c[N][N];

int(*dev_a)[N], (*dev_b)[N], (*dev_c)[N];

for (int y = 0; y < N; ++y)

{

for (int x = 0; x < N; ++x)

{

a[x][y] = x + y * N;

b[x][y] = x * x + y * N;

}

}

cudaMalloc(&dev_a, N * N * sizeof(int));

cudaMalloc(&dev_b, N * N * sizeof(int));

cudaMalloc(&dev_c, N * N * sizeof(int));

cudaMemcpy(dev_a, a, N * N * sizeof(int), cudaMemcpyHostToDevice);

cudaMemcpy(dev_b, b, N * N * sizeof(int), cudaMemcpyHostToDevice);

dim3 threadsPerBlock(TPB, TPB);

dim3 numBlocks((N + TPB - 1) / threadsPerBlock.x, (N + TPB - 1) / threadsPerBlock.y);

MatAdd <<<numBlocks, threadsPerBlock >>>(dev_a, dev_b, dev_c);

cudaMemcpy(c, dev_c, N * N * sizeof(int), cudaMemcpyDeviceToHost);

int temp = 0;

for (int y = 0; y < N; ++y)

{

for (int x = 0; x < N; ++x)

{

temp = a[x][y] + b[x][y];

if (temp != c[x][y])

{

printf("Failure at %d
%dn", x, y);

}

}

}

printf("Sum is
%dn", temp);

cudaFree(dev_a);

cudaFree(dev_b);

cudaFree(dev_c);

//return 0;

system("pause");
}

在这段代码中,矩阵中每个索引使用一个线程来计算,通过

int i = blockIdx.x * blockDim.x + threadIdx.x;
int j = blockIdx.y * blockDim.y + threadIdx.y;

来计算当前线程的绝对坐标,该坐标正好对应于矩阵的位置。

需要注意的是,C语言使用太大的数组时,最好把数组定义为全局的,否则受栈的限制,可能会报错:
Segmentation fault: 11

最后

以上就是勤奋大象为你收集整理的CUDA矩阵加法的全部内容,希望文章能够帮你解决CUDA矩阵加法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部