CUDA学习笔记7——CUDA内存组织

news2024/11/23 17:07:53

CUDA内存组织

CUDA设备内存的分类与特征
内存类型物理位置访问权限可见范围生命周期
1全局内存芯片外可读写所有线程和主机端由主机分配与释放
2常量内存芯片外只读所有线程和主机端由主机分配与释放
3纹理和表面内存芯片外一般只读所有线程和主机端由主机分配与释放
4寄存器内存芯片内可读写单个线程所在线程
5局部内存芯片外可读性单个线程所在线程
6共享内存芯片内可读性单个线程块所在线程块
  1. 全局内存:核函数中所有线程都能访问其中的数据。
    用cudaMalloc()为全局内存变量分配设备内存;
    用cudaMemcpy()将主机数据复制到全局内存;

  2. 常量内存:一共64KB,只读,可见范围与生命周期与全局内存一样,访问速度比全局内存快;在核函数未满用 _constant_ 定义变量;并使用cudaMemcpyToSymbol()将数据从主机端复制到设备的常量内存。

  3. 纹理内存与表面内存:类似于常量内存(可见范围与生命周期相同);

  4. 寄存器:在核函数中定义的不加任何限定符的变量一般来说放在寄存器中,核函数定义不加任何限定符的数组可能放于寄存器,也可能放于局部内存中;

  5. 局部内存:寄存器放不下的变量,索引值不能在编译时确定的数组;

  6. 共享内存:与寄存器类似,存在于芯片上,仅次于寄存器的读写速度;

CUDA中的内存组织示意图

在这里插入图片描述

GPU设备规格查询
#include <stdio.h>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"

int main()
{
	int device_id = 0;
	
	cudaDeviceProp prop;
	cudaGetDeviceProperties(&prop, device_id);

	printf("Device id:								%d\n", device_id);
	printf("Device name:								%s\n", prop.name);
	printf("Compute capability:							%d.%d\n", prop.major, prop.minor);
	printf("Amount of global memory:						%g GB\n", prop.totalGlobalMem / 1024.0);
	printf("Amount of constant memory:						%g KB\n", prop.totalConstMem / 1024.0);
	printf("Maximum grid size:							%d %d %d\n",prop.maxGridSize[0], prop.maxGridSize[1], prop.maxGridSize[2]);
	printf("Maximum block size:							%d %d %d\n", prop.maxThreadsDim[0], prop.maxThreadsDim[1], prop.maxThreadsDim[2]);
	printf("Number of SMs:								%d\n", prop.multiProcessorCount);

	printf("----------------------------- \n");

	printf("Maximum amount of shared memory per block:				%g KB\n", prop.sharedMemPerBlock / 1024.0);
	printf("Maximum amount of shared memory per SM:					%g KB\n",prop.sharedMemPerMultiprocessor / 1024.0);
	
	printf("Maximum number of registers per block:					%d K\n", prop.regsPerBlock / 1024.0);
	printf("Maximum number of registers per SM:					%d K\n", prop.regsPerMultiprocessor / 1024.0);

	printf("Maximum number of threads per block:					%d \n", prop.maxThreadsPerBlock);
	printf("Maximum number of threads per SM:					%d \n", prop.maxThreadsPerMultiProcessor);


	return 0;
}

在这里插入图片描述

全局内存的合并与非合并访问

合并访问:一个线程束对全局内存的一次访问(读/写)导致最少数量的数据传输;否则为非合并访问。

利用共享内存和统一内存优化矩阵乘

在这里插入图片描述

#include <stdio.h>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include<math.h>
#include <malloc.h> 
#include <opencv2/opencv.hpp>
#include <stdlib.h>

//利用share memory 和统一内存优化矩阵乘

#define M 1000
#define N 500
#define K 1000

__managed__ int a[M*N];
__managed__ int b[N*K];
__managed__ int c_gpu[M*K];
__managed__ int c_cpu[M*N];

#define BLOCK_SIZE 16

__global__ void gpu_matrix(int* a, int* b, int* c, int m, int n, int k)
{
	__shared__ int sub_a[BLOCK_SIZE][BLOCK_SIZE];
	__shared__ int sub_b[BLOCK_SIZE][BLOCK_SIZE];

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

	int tmp = 0;
	int idx;

	for (int step = 0; step < N/BLOCK_SIZE; step++)
	{
		int step_x = step*BLOCK_SIZE + threadIdx.x;
		int step_y = y;
		idx = step_y*n + step_x;

		if (step_x>n || step_y>m)
		{
			sub_a[threadIdx.y][threadIdx.x] = 0;
		}
		else
		{
			sub_a[threadIdx.x][threadIdx.x] = a[idx];
		}

		step_x = x;
		step_y = step*BLOCK_SIZE + threadIdx.y;
		idx = step * k + step_x;
		if (step_x >= k || step_y>=n)
		{
			sub_b[threadIdx.y][threadIdx.x] = 0;
		}
		else
		{
			sub_b[threadIdx.y][threadIdx.x] = b[idx];
		}

		__syncthreads();

		for (int i = 0; i < BLOCK_SIZE; i++)
		{
			tmp += sub_a[threadIdx.y][i] * sub_b[i][threadIdx.x];
		}

		__syncthreads();
	}

	if (x<k && y<m)
	{
		c[y*k + x] = tmp;
	}

}

void cpu_matrix(int* a, int* b, int* c, int m, int n, int k)
{
	for (int y = 0; y < m; y++)
	{
		for (int x = 0; x < k; x++)
		{
			int tmp = 0;
			for (int step = 0; step < n; step++)
			{
				tmp += a[y*n + step] * b[step*n + x];
			}
			c[y*k + x] = tmp;
		}
	}

}



int main()
{
	for (int y = 0; y < M; y++)
	{
		for (int x = 0; x < N; x++)
		{
			a[y * N + x] = rand() % 1024;
		}
	}

	for (int y = 0; y < N; y++)
	{
		for (int x = 0; x < K; x++)
		{
			b[y*K + x] = rand() % 1024;
		}
	}

	unsigned int grid_x = (K + BLOCK_SIZE - 1) / BLOCK_SIZE;
	unsigned int grid_y = (M + BLOCK_SIZE - 1) / BLOCK_SIZE;

	dim3 dimGrid(grid_x, grid_y);
	dim3 dimBlock(BLOCK_SIZE, BLOCK_SIZE);

	gpu_matrix<<<dimGrid, dimBlock>>>(a, b, c_gpu, M, N, K);
	cpu_matrix(a, b, c_cpu, M, N, K);

	bool errors = false;

	for (int y = 0; y < M; y++)
	{
		for (int x = 0; x < K; x++)
		{
			if (fabs(c_cpu[y*K + x] - c_gpu[y*K + x]) > (1.0e-10))
			{
				errors = true;
			}
		}
	}

	printf("Result: %s\n", errors ? "Error" : "Pass");

	return 0;
}



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1183710.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++数据结构】顶层父类的创建与类族结构的进化

文章目录 前言一、为什么需要创建顶层父类二、创建顶层父类Object的意义三、创建顶层父类Object3.1 顶层父类接口3.2 Object具体实现new和delete运算符重载的实现 和 ! 的运算符重载实现 3.3 纯虚析构函数实现 四、类族的结构进化4.1 怎样进化4.2 SmartPointer的进化4.3 Except…

什么是Target Plus EDI?

“Target Plus” 是美国知名零售商Target&#xff08;塔吉特&#xff09;推出的一个合作伙伴计划。这个计划允许第三方卖家在Target.com&#xff08;塔吉特官方网站&#xff09;上销售他们的商品。通过Target Plus&#xff0c;第三方卖家可以将他们的产品列在Target.com上&…

uni-app 、Spring Boot 、ant Design 打造的一款跨平台包含小说(仿真翻页、段落听书)、短视频、壁纸等功能含完备后台管理的移动应用

简介 咪哩快看&#xff0c;为用户提供优质阅读&#xff0c;短视频&#xff0c;共同记录美好生活的移动应用&#xff0c;并含有一套完备的后台管理体系&#xff0c;助力开发者快速数字化&#xff0c;开启你的财富之门&#xff01; 官网&#xff1a; https://miliqkdoc.motopa.…

Antd Procomponent 之 proForm - 高级表单

本文作者系360奇舞团前端开发工程师 ProForm 在原来的 Form 基础上增加一些语法糖和更多的布局设置&#xff0c;帮助我们快速的开发一个表单。同时添加一些默认行为&#xff0c;让我们的表单默认好用。分步表单&#xff0c;Modal 表单&#xff0c;Drawer 表单&#xff0c;查询表…

DC电源模块的价格因素是什么?如何进行成本优化?

BOSHIDA DC电源模块的价格因素是什么&#xff1f;如何进行成本优化&#xff1f; DC电源模块是一种用于直流电路中的电源转换器&#xff0c;主要用于将输入电源的电压、电流和频率转换为适合设备的直流电源。随着电子设备的广泛应用&#xff0c;DC电源模块的需求也日益增加。而…

含泪整理的超全窗口函数:数据开发必备

最近在搞一些面试和课程答辩的时候&#xff0c;问什么是窗口函数&#xff0c;知道哪些窗口函数?最多的答案就是row_number、rank、dense_rank&#xff0c;在问一下还有其他的吗&#xff1f;这时同学就蒙了,还有其他的窗口函数&#xff1f;其实上面的回答也只是专用窗口函数&am…

多门店自助点餐+外卖二合一小程序源码系统 带完整搭建教程

随着餐饮业的快速发展和互联网技术的不断进步&#xff0c;越来越多的餐厅开始采用自助点餐和外卖服务。市场上许多的外卖小程序APP应运而生。下面罗峰来给大家介绍一款多门店自助点餐外卖二合一小程序源码系统。该系统结合了自助点餐和外卖服务的优势&#xff0c;为餐厅提供了一…

照明灯具哪个品牌好?照明灯具十大排行榜

现在儿童近视率越来越高了&#xff0c;用眼过度疲劳是导致近视的主要因素&#xff0c;学习环境的光线是否合适&#xff0c;都会直接影响用眼的疲劳程度。所以给孩子营造一个良好的学习环境非常重要&#xff01;一款护眼台灯可以很好的预防近视&#xff0c;为大家推荐五款护眼台…

【今日文章】:如何用css 实现星空效果

【今日文章】&#xff1a;如何用css 实现星空效果 需求实现tips: 需求 用CSS 实现星空效果的需求&#xff1a; 屏幕上有“星星”&#xff0c;且向上移动。移动的时候&#xff0c;动画效果要连贯&#xff0c;不能出现闪一下的样子。 实现 这里我们需要知道&#xff0c;“星星”是…

复杂逻辑的开发利器—Mendix快速实现AQL质量抽检

Mendix低代码开发平台适用于复杂的业务逻辑场景&#xff0c;这句话大家早有耳闻&#xff0c;本期小编就为您打开智慧之光&#xff0c;仅从AQL小侧面&#xff0c;来管窥一二——Mendix如何形成第五代编程语言&#xff0c;来完成数据逻辑与建模、业务算法逻辑与建模的。&#xff…

Excel下拉填充时,如何使得数字不递增?

问题描述&#xff1a;Excel下拉填充时&#xff0c;如何使得数字不递增&#xff1f; 解决办法&#xff1a;先下拉填充数据之后&#xff0c;看到最后一个单元格的右下角有个填充设置的符号&#xff0c;右键选择复制单元格即可。其中这里的填充序列就是递增数字的操作。

塔望食研院|骆驼奶市场规模庞大,百亿体量,品牌升级!

自2022年12月塔望咨询开设塔望食品大健康行业与消费研究院&#xff08;简称塔望食研院&#xff09;栏目以来&#xff0c;塔望食研院以“为食品行业品牌高质量发展赋能”为理念&#xff0c;不断发布食品大健康行业研究、消费研究报告。塔望食研院致力于结合消费调研数据、企业数…

如何使用ESB产品对接业务系统接口

ESB企业服务总线在实际项目中主要用于各业务系统之间的集成&#xff0c;集成包括数据集成、应用集成以及业务单据集成等&#xff0c;ESB企业服务总线主要包含三部分&#xff1a;ESB设计器、SMC管理控制台以及Server运行环境&#xff0c;ESB设计器用于服务以及集成流程的开发&am…

AI时代项目经理与架构师的成长之道:ChatGPT让你插上翅膀

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 在AI时代&#xff0c;项…

Ubuntu中增加交换内存

前言 在运行一些代码编译或者clang-format会占用大量的内存&#xff0c;此时可能会出现电脑卡死的情况&#xff0c;在ubuntu中可以通过增加交换内存来临时解决这个问题&#xff0c;相对于硬件改动成本更低&#xff0c;但是性能不如物理内存。 实践 查看当前的交换内存大小 …

【MySQL日志与备份篇】主从复制

主从复制 文章目录 主从复制1. 概述2. 主从复制的原理2.1 原理剖析2.2 复制的基本原则 3. 一主一从架构搭建3.1 准备工作3.2 主机配置文件3.3 从机配置文件3.4 主机&#xff1a;建立账户并授权3.5 从机&#xff1a;配置需要复制的主机3.6 停止主从同步3.7 后续 4. 同步数据一致…

关于WMS三个核心问题的解读

一、企业是否需要上WMS系统&#xff0c;可以从以下五个方面入手&#xff1a; 1.库存管理状况&#xff1a;了解企业的库存管理状况&#xff0c;是否存在库存冗余、漏洞、过度采购、库存盘点不准确等问题。 2.物流效率水平&#xff1a;需要了解企业物流效率水平&#xff0c;包括…

全网最全的设计模式专栏完结,建议点赞收藏

引言 代码写得烂可能并不是他的问题&#xff0c;推这个专栏给他看看。 本系列是《和8年游戏主程一起学习设计模式》&#xff0c;让糟糕的代码在潜移默化中升华。 大家好&#xff0c;白驹过隙&#xff0c;岁月如梭。本系列文章终于迎来了完结&#xff0c;距离开始已经一个多月…

阿里云Intel Xeon Platinum可扩展处理器性能如何?

阿里云Intel Xeon Platinum可扩展处理器性能如何&#xff1f;目前云服务器ECS经济型e实例采用该款CPU型号&#xff0c;正好阿里云服务器网购买了一台2核CPU、2G内存、3M固定带宽、40G ESSD Entry云盘&#xff0c;一年优惠价99元&#xff0c;第二年续费不涨价依旧是99元一年&…

nerdctl install【nerdctl 安装】

文章目录 1. 在线安装2. 离线安装 1. 在线安装 #!/bin/bashsource ./config.shENABLE_DOWNLOAD${ENABLE_DOWNLOAD:-true}if [ ! -e files ]; thenmkdir -p files fiFILES_DIR./files if $ENABLE_DOWNLOAD; thenFILES_DIR./tmp/filesmkdir -p $FILES_DIR fi# download files, i…