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  %d\n", x, y);
            }
        }
    }
    printf("Sum is  %d\n", 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值