当前位置: 首页 > news >正文

CUDA拷贝二维数组到GPU内存中

CUDA 复杂问题 + 细节问题 解答 见 CUDA复杂问题 + 细节问题 解答

网上没找到如何拷贝二维数组到GPU的例程,所以我就自己写一个,其实原理也很简单,就是用三维指针导入给二维指针分配内存。

先说一下我们的目标:导入到GPU一个二维数组:dev_data[arrayNum][mwidth * mheight],该数组内元素的值是data[i][j] = i + 0.001*j。我们首先先输出data[i][7]。

然后我们再在GPU里把数组的data[i][7]全都改为82,然后再输出所有的data[i][7]。

最后应该得到的结果:

先说一下基本流程:

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include "cuda.h"
#include <iostream>
using std::cout;
using std::endl;
#define arrayNum 100
#define mwidth 10
#define mheight 10

float **data;
float ** midData;
float **dev_data;

int main()
{
	//用于获取GPU内存数据来输出的数组
	float *dev_c = 0;
	float *c = (float*)malloc(arrayNum * sizeof(float));
	cudaMalloc((void**)&dev_c, arrayNum * sizeof(float));
	
	//初始化GPU内的数据
	DataInit();

	//把GPU内的数据输出
	dim3    blocks(2, 2);
	dim3    threads(5, 5);
	cudaTest << <blocks, threads >> >(dev_c, dev_data);
	cudaMemcpy(c, dev_c, arrayNum * sizeof(float), cudaMemcpyDeviceToHost);
	for (int i = 0; i < arrayNum; i++) {
		cout << c[i] << " ";
	}
	cout << endl;
	cout << endl;
	//改变一下GPU内存数据
	cudaChange << <blocks, threads >> >(dev_c, dev_data);
	//输出一下改变以后的值
	cudaTest << <blocks, threads >> >(dev_c, dev_data);
	cudaMemcpy(c, dev_c, arrayNum * sizeof(float), cudaMemcpyDeviceToHost);
	for (int i = 0; i < arrayNum; i++) {
		cout << c[i] << " ";
	}
	cout << endl;
	cout << endl;
	system("pause");
	return 0;
}

核函数:

__global__ void cudaTest(float *c, float **dev_data)
{
	int x = threadIdx.x + blockIdx.x * blockDim.x;
	int y = threadIdx.y + blockIdx.y * blockDim.y;
	int offset = x + y * blockDim.x * gridDim.x;
	c[offset] = dev_data[offset][7];
}
__global__ void cudaChange(float *c, float **dev_data)
{
	int x = threadIdx.x + blockIdx.x * blockDim.x;
	int y = threadIdx.y + blockIdx.y * blockDim.y;
	int offset = x + y * blockDim.x * gridDim.x;
	dev_data[offset][7] = 82;
}

重点内容是DataInit()函数,负责数据的初始化:

float **data;
float ** midData;
float **dev_data;

首先先把二维数组进行初始化:

	data = (float**)malloc(arrayNum * sizeof(float * ));
	midData = (float**)malloc(arrayNum * sizeof(float *));
	cudaMalloc((void***)&(dev_data), arrayNum * sizeof(float * ));

midData的作用是:

即,在CPU上保留GPU内存的地址,提供拷贝给GPU二维内存指针:

float **data;
float ** midData;
float **dev_data;
void DataInit(void) {
	data = (float**)malloc(arrayNum * sizeof(float * ));
	midData = (float**)malloc(arrayNum * sizeof(float *));
	cudaMalloc((void***)&(dev_data), arrayNum * sizeof(float * ));
	for (int i = 0;i < arrayNum;i++) {
		data[i] = (float *)malloc(mwidth * mheight * sizeof(float));
		cudaMalloc((void**)&(midData[i]), mwidth * mheight * sizeof(float));
		for (int j = 0; j < mwidth * mheight; j++) {
			data[i][j] = i + 0.001*j;
		}
		cudaMemcpy(midData[i], data[i], mwidth * mheight * sizeof(float), cudaMemcpyHostToDevice);
	}
	cudaMemcpy(dev_data, midData, arrayNum * sizeof(float *), cudaMemcpyHostToDevice);
}

这样就能把二维数组拷贝到内存里使用了。

相关文章:

  • 微积分 重难点记录 一 曲线间的面积 + 体积
  • 多重重要性采样(MIS)与光线追踪技术
  • VTK体渲染应用实例:读取并可视化MHD数据的程序
  • CUDA Handbook 关于CUDA的硬件架构和软件架构的详细解读
  • CUDA Handbook CUDA的硬件架构
  • 使用OpenMP进行多线程加速for循环
  • 半角切片阴影 half-angle slice based —— 全网最好和最易懂的算法描述
  • 什么是shader aliasing着色器走样
  • 微积分 重难点记录 二 三角替换 + 通过部分分式分解的有理函数积分
  • 串行指令的并行方法(防止并行Hazard)-pipline bubble、操作数前移、乱序执行等
  • SIMD:单指令多数据
  • CUDA线程同步
  • 共享内存 Bank冲突
  • 线程分支
  • PBRT的程序运行流程
  • 【Leetcode】101. 对称二叉树
  • [译]如何构建服务器端web组件,为何要构建?
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • 〔开发系列〕一次关于小程序开发的深度总结
  • Apache Zeppelin在Apache Trafodion上的可视化
  • Codepen 每日精选(2018-3-25)
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • Java反射-动态类加载和重新加载
  • Java-详解HashMap
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • MySQL数据库运维之数据恢复
  • PHP的类修饰符与访问修饰符
  • Spring Cloud中负载均衡器概览
  • windows-nginx-https-本地配置
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 数据科学 第 3 章 11 字符串处理
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 微信小程序开发问题汇总
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 追踪解析 FutureTask 源码
  • 自动记录MySQL慢查询快照脚本
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 函数计算新功能-----支持C#函数
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • # Panda3d 碰撞检测系统介绍
  • #每天一道面试题# 什么是MySQL的回表查询
  • $.ajax,axios,fetch三种ajax请求的区别
  • (Matlab)使用竞争神经网络实现数据聚类
  • (ZT)出版业改革:该死的死,该生的生
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (六)c52学习之旅-独立按键
  • (七)理解angular中的module和injector,即依赖注入
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • .net CHARTING图表控件下载地址