CUDA学习之一:二维矩阵加法
今天忙活了3个小时,竟然被一个苦恼的CUDA小例程给困住了,本来是参照Rachal zhang大神的CUDA学习笔记来一个模仿,结果却自己给自己糊里糊涂,最后还是弄明白了一些。
RZ大神对CUDA关于kernel,memory的介绍还是蛮清楚,看完决定写一个二维数组的加法。如果是C++里的加法,那就简单了,用C[i][j] = A[i][j] +B[i][j]就可以。
void CppMatAdd(int A[M][N],int B[M][N],int C[M][N]){
for(int i=;i<M;i++)
for(int j=;j<N;j++)
C[i][j] = A[i][j] + B[i][j];
}
int main()
{
int a[M][N] = {,,,,,,,,,,,};
int b[M][N] = {,,,,,,,,,,,};
int c[M][N] ;
CppMatAdd(a,b,c);
std::cout<<c[][];
}
运行上面代码,就可以实现二维矩阵(也就是数组)的加法运算。
但是CUDA计算是在GPU上实现的,要划分出专门的内存区域给GPU做运算,结果就是,我们必须划分出主机内存、设备内存分别供CPU、GPU访问。
对于一维的情况,我们设置好主机变量,设备变量即可。具体可以参找RZ的博客。
但是二维的情况麻烦就来了,最一开始我也是设置出主机变量,设备变量,一一对应的分配内存,拷贝数据,GPU运算,最后考出结果。但是发现怎么调试结果都不对,最主要的原因是c++的二维数组实际上是一维数组的指针,所以,无法按照一位数组的模式去拷贝数据,结果相映的写法就麻烦许多,其实说到底还是还原成一维数组的方法去做的加法运算,代码如下,具体就不想赘述了,代码能力有限,慢慢来吧,今天算是把指针弄的更清楚了。
/*--------------------------------------------
* Date:2015-3-18
* Author:李根
* FileName:.cpp
* Description:CUDA二维数组加法
------------------------------------------------*/
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <iostream>
#include <stdio.h> static const int M = ;
static const int N = ; //矩阵加法的kernel
__global__ void addMat(int **A,int **B,int **C)
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
int j = blockIdx.y * blockDim.y + threadIdx.y;
if(i < M && j < N)
C[i][j] = A[i][j] + B[i][j];
} int main()
{int **A = (int **)malloc(M*sizeof(int *)); //host memory
int **B = (int **)malloc(M*sizeof(int *)); //host memory
int **C = (int **)malloc(M*sizeof(int *)); //host memory
int *dataA =(int *)malloc(M*N*sizeof(int )); //host memory data
int *dataB = (int *)malloc(M*N*sizeof(int )); //host memory data
int *dataC =(int *)malloc(M*N*sizeof(int )); //host memory data int **dev_A ; //device memory
int **dev_B ; //device memory
int **dev_C ; //device memory
int *dev_dataA ; //device memory data
int *dev_dataB ; //device memory data
int *dev_dataC ; //device memory data cudaMalloc((void**)(&dev_A), M*sizeof(int*));
cudaMalloc((void**)(&dev_dataA), M*N*sizeof(int));
cudaMalloc((void**)(&dev_B), M*sizeof(int*));
cudaMalloc((void**)(&dev_dataB), M*N*sizeof(int));
cudaMalloc((void**)(&dev_C), M*sizeof(int*));
cudaMalloc((void**)(&dev_dataC), M*N*sizeof(int)); for(int i=;i<M*N;i++)
{
dataA[i] = i;
dataB[i] = i+;
dataC[i] =;
} cudaMemcpy((void*)(dev_dataA), (void*)(dataA), M*N*sizeof(int*), cudaMemcpyHostToDevice);
cudaMemcpy((void*)(dev_dataB), (void*)(dataB), M*N*sizeof(int*), cudaMemcpyHostToDevice); for(int i=;i<M;i++)
{
A[i] = dev_dataA + N*i;
B[i] = dev_dataB + N*i;
C[i] = dev_dataC + N*i;
} cudaMemcpy((void*)(dev_A), (void*)(A), M*sizeof(int*), cudaMemcpyHostToDevice);
cudaMemcpy((void*)(dev_B), (void*)(B), M*sizeof(int*), cudaMemcpyHostToDevice);
cudaMemcpy((void*)(dev_C), (void*)(C), M*sizeof(int*), cudaMemcpyHostToDevice); dim3 threadPerBlock(,);
dim3 numBlocks((N+threadPerBlock.x-)/(threadPerBlock.x), (M+threadPerBlock.y-)/(threadPerBlock.y));
addMat<<<numBlocks,threadPerBlock>>>(dev_A,dev_B,dev_C);
cudaMemcpy((void*)(dataC), (void*)(dev_dataC), M*N*sizeof(int), cudaMemcpyDeviceToHost);
for(int i=;i<M*N;i++)
std::cout<<dataC[i]<<" ";
cudaFree((void*)dev_dataC);
cudaFree((void*)dev_C);
free(C);
free(dataC);
cudaFree((void*)dev_dataB);
cudaFree((void*)dev_B);
free(B);
free(dataB);
cudaFree((void*)dev_dataA);
cudaFree((void*)dev_A);
free(A);
free(dataA);
getchar();
}
博客恢复更新,慢慢的积累吧
CUDA学习之一:二维矩阵加法的更多相关文章
- [LeetCode] Search a 2D Matrix II 搜索一个二维矩阵之二
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...
- [LeetCode] Search a 2D Matrix 搜索一个二维矩阵
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...
- IT公司100题-35- 求一个矩阵中最大的二维矩阵(元素和最大)
问题描述: 求一个矩阵中最大的二维矩阵(元素和最大).如: 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 中最大的是: 4 5 9 10 分析: 2*2子数组的最大和.遍历求和,时 ...
- [CareerCup] 11.6 Search a 2D Matrix 搜索一个二维矩阵
11.6 Given an M x N matrix in which each row and each column is sorted in ascending order, write a m ...
- lintcode:搜索二维矩阵II
题目 搜索二维矩阵 II 写出一个高效的算法来搜索m×n矩阵中的值,返回这个值出现的次数. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每一列的整数从上到下是排序的. 在每一行或每一列中没 ...
- lintcode :搜索二维矩阵
题目: 搜索二维矩阵 写出一个高效的算法来搜索 m × n矩阵中的值. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每行的第一个数大于上一行的最后一个整数. 样例 考虑下列矩阵: [ [1 ...
- Python小代码_5_二维矩阵转置
使用列表推导式实现二维矩阵转置 matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]] print(matrix) matrix_t = [[ro ...
- LeetCode(74):搜索二维矩阵
Medium! 题目描述: 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 ...
- lintcode-28-搜索二维矩阵
搜索二维矩阵 写出一个高效的算法来搜索 m × n矩阵中的值. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每行的第一个数大于上一行的最后一个整数. 样例 考虑下列矩阵: [ [1, 3, ...
随机推荐
- python-zmail发送邮件
import zmail #发送测试报告到邮件 with open(r'F:\asus\auto_file\unittest_html\2019-06-30 10-31-03report.html', ...
- 单例设计模式(Singleton)的优化
单例模式的优化 单例模式懒汉式写法,单例模式的优化有以下四个方面: 使用同步保证线程安全synchronized 使用volatile关键字:volatile关键字提醒编译器后面所定义的变量随时都有可 ...
- hive中Sort By,Order By,Cluster By,Distribute By,Group By的区别
order by: hive中的order by 和传统sql中的order by 一样,对数据做全局排序,加上排序,会新启动一个job进行排序,会把所有数据放到同一个reduce中进行处理,不管数 ...
- 分组函数 partition by 的详解,与order by 区别
partition by关键字是分析性函数的一部分,它和聚合函数(如group by)不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录, partition by ...
- 【leetcode】726. Number of Atoms
题目如下: 解题思路:我用的是递归的方法,每次找出与第一个')'匹配的'('计算atom的数量后去除括号,只到分子式中没有括号为止.例如 "K4(ON(SO3)2)2" -> ...
- php strnatcmp()函数 语法
php strnatcmp()函数 语法 作用:自然顺序法比较字符串直线往复电机 语法:strnatcmp(string1,string2) 参数: 参数 描述 string1 必须,规定要比较的第一 ...
- 安装ThinkPHP
ThinkPHP5的环境要求如下: PHP >= 5.4.0 PDO PHP Extension MBstring PHP Extension CURL PHP Extension 严格来说,T ...
- python使用开源图片识别第三方库tesseract
详细安装博客:https://blog.csdn.net/luanyongli/article/details/81385284 第一步tesseract-ocr的安装如果不会请参照:https:// ...
- Mac上VMWare Fusion配置多台cent os
一.创建虚拟机(准备工作) 1.使用VMWare Fusion 创建第一台虚拟机 2.选择操作系统(本次使用的是使用cent os 6.5 64bit 系统) 3.选择磁盘大小(楼主mac上的磁盘大小 ...
- AGC024B Backfront
题目大意 给你一个1~n的排列 你有两个操作:将一个数移到最后或将一个数移到最前 问将排列排序最少要几次操作 分析 年纪大了,脑子不行了.. 实际我们只需求出对与一段连续的数它在排列中已经有序的最长长 ...