CUDA学习笔记06:共享内存加速矩阵乘法

参考资料

CUDA编程模型系列六(利用shared memory和统一内存优化矩阵乘)_哔哩哔哩_bilibili

代码片段

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#include <math.h>#define M 1000
#define N 500
#define K 800/* CUDA自动维护申请和释放 */
__managed__ int a[M * N];
__managed__ int b[N * K];
__managed__ int c_gpu[M * K];
__managed__ int c_cpu[M * K];#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 = threadIdx.x + blockDim.x * threadIdx.x;int y = threadIdx.y + blockDim.y * threadIdx.y;int tmp = 0;int idx;for (int step = 0; step < n / BLOCK_SIZE; step++){/* 首先加载 小a 矩阵 */int step_x = step * BLOCK_SIZE + threadIdx.x;int step_y = threadIdx.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.y][threadIdx.x] = a[idx];}/* 再加载小b矩阵 */step_x = x;step_y = step * BLOCK_SIZE + threadIdx.y;idx = step_y * 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 z = 0; z < n; z++) {tmp += (a[y * n + z] * b[z * k + 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] = x % 1024;}}for (int y = 0; y < N; y++) {for (int x = 0; x < K; x++) {b[y * K + x] = x % 1024;}}unsigned int grid_x = (K + BLOCK_SIZE - 1) / BLOCK_SIZE;unsigned int grid_y = (M + BLOCK_SIZE - 1) / BLOCK_SIZE;dim3 gridDim(grid_x, grid_y);dim3 dimBlock(BLOCK_SIZE, BLOCK_SIZE);gpu_matrix<<<gridDim, dimBlock>>>(a, b, c_gpu, M, N, K);cudaDeviceSynchronize();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(abs(c_cpu[y * K + x] - c_gpu[y * K + x]) > (1.0e-10))errors = true;}}printf("Result: %s \n", errors ? "Pass" : "Error");return 0;
}

小结

1. 我的代码是可以在windows平台运行的。

2. 建议还是跟着UP主自己手敲一遍,看会是一遍,自己写又是另一遍。

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

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

相关文章

llama2c(4)之forward、sample、decode

1、forward float* logits forward(transformer, token, pos); 输入transformer的参数&#xff0c;当前token&#xff0c;pos位置&#xff0c;预测出下一个token的预测值&#xff08;用矩阵乘&#xff0c;加减乘除等运算构成Transformer&#xff09; (gdb) p *logits $9 2.19…

YOLOv8.1.0安装

【YOLO】YOLOv8训练环境配置 python 3.8.18 cuda 11.3.1 cudnn 8.2.1 pytorch 1.12.1-gpu版 - 知乎 (zhihu.com) 一、Anaconda 默认装好了可用的Anaconda&#xff0c;安装教程见Win10系统anaconda安装 - 知乎 (zhihu.com) 二、在虚拟环境下用conda安装 1.创建虚拟环境 …

大唐杯学习笔记:Day9

1.1 HARQ总体介绍 HARQ是FEC和ARQ的一种混合技术机制。在纠错能力范围内进行自动纠正错误,超出纠错范围则要求发送端重新发送,增加了系统的可靠性,提高了传输效率。HARQ是MAC层的快速传输机制,NR中上下行均采用异步HARQ。 支持多个并行的stop-and-wait进程,进程号在PDCCH的DCI…

【力扣白嫖日记】1164.指定日期的产品价格

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 1164.指定日期的铲平价格 表&#xff1a;Products 列名类型product_idintnew_priceintchange_datedate (pr…

记录汇川:IO隔离编程

IO隔离&#xff1a;方便程序修改 无论是输入点坏了还是输出点坏了&#xff0c;或者人为接错线&#xff0c;或者对调点&#xff0c;我们只需要更改IO隔离得输入输出就可以了。方便。 停止按钮外接常闭&#xff0c;里面也使用常闭&#xff0c;为了断线检测功能(安全)&#xff…

300分钟吃透分布式缓存-23讲:Redis是如何淘汰key的?

淘汰原理 首先我们来学习 Redis 的淘汰原理。 系统线上运行中&#xff0c;内存总是昂贵且有限的&#xff0c;在数据总量远大于 Redis 可用的内存总量时&#xff0c;为了最大限度的提升访问性能&#xff0c;Redis 中只能存放最新最热的有效数据。 当 key 过期后&#xff0c;或…

room数据库升级

room数据库升级 一、操作步骤说明 增加数据库版本号 在Database注解中增加版本号(version)&#xff0c;比如从version 1升级到version 2。 Database(entities [Song::class,],**version 1**,//1->2 ) abstract class AppDataBase : RoomDatabase() { }定义数据库变化 根据…

一个爬虫自动化数据采集的故事~

目录 一、原文二、故事前半段背景内容三、正经的讲点DrissionPage知识四、故事的收尾 一、原文 原文来自一个爬虫自动化数据采集的故事~ , 建议点击链接看文章末尾的视频笔者不擅长自动化&#xff0c;一个小小故事分享给大家&#xff0c;仅个人观点 二、故事前半段背景内容 …

剑指offer面试算法题目,自己总结的

JZ31 栈的压入、弹出序列-C++-CSDN博客 剑指 Offer(C++版本)系列:从尾到头打印单链表(C++)-CSDN博客 剑指offer》15--二进制中1的个数[C++]-CSDN博客 《剑指offer》14--剪绳子(整数拆分)[C++]-CSDN博客 剑指 Offer 12. 矩阵中的路径-CSDN博客 C++--机器人的运动范围…

IP-guard邮件管控再升级,记录屏幕画面,智能阻断泄密邮件

邮件是工作沟通以及文件传输的重要工具,却也成为了信息泄露的常见渠道。员工通过邮件对外发送了什么内容,是否含有敏感信息都无从得知,机密通过邮件渠道外泄也难以制止。想要防止企业的重要信息通过邮件方式泄露,我们不仅需要通过技术措施对外发邮件的行为进行规范,也要对…

使用大带宽服务器对网站有什么好处?

近年来大带宽服务器频频出现在咱们的视野当中&#xff0c;选用的用户也在与日增长。那么究其主要原因是什么?租用大带宽服务器的好处又有哪些? 今天德迅云安全带您来了解下。1.有效提升网站访问速度 一般来说&#xff0c;正规的网站对用户体验度都是非常有讲究的&#xff0c;…

L-2:插松枝(Python)

作者 陈越 单位 浙江大学 人造松枝加工场的工人需要将各种尺寸的塑料松针插到松枝干上&#xff0c;做成大大小小的松枝。他们的工作流程&#xff08;并不&#xff09;是这样的&#xff1a; 每人手边有一只小盒子&#xff0c;初始状态为空。每人面前有用不完的松枝干和一个推送…

命令行中当前目录下打开资源管理器窗口

有时候使用命令行时执行命令生成了一些文件&#xff0c;想在资源管理器窗口中打开&#xff0c;或者向当前位置放入文件&#xff0c;以供处理。往往需要打开当前目录的资源管理器窗口&#xff0c;通常就是文件资源管理器&#xff0c;或者我的电脑一层层找到当前目录&#xff0c;…

手机号验证码重新发送

前文叙述 很久以前做的一个 demo &#xff0c;纯 HTML 、CSS、js 制作&#xff0c;一定时间段之后才可以重新发送验证码&#xff0c;如 60s 后再次发送验证码&#xff0c;在该时间段内发送验证码按钮为禁用状态&#xff0c;实战开发过程也亦是同理&#xff0c;因此记录一手。 一…

内存的基本特性

初识内存 1&#xff0c;内存的基本特性 现代计算机的基本组成 现代计算机之父--冯诺伊曼提出了计算机的基本组成&#xff1a; 运算器&#xff1a;负责算术运算和逻辑运算&#xff0c;目前已经集成到CPU中。 控制器&#xff1a;负责控制系统的各部件&#xff0c;使之协调的…

【笔记】Android ServiceStateTracker 网络状态变化逻辑及SPN更新影响

业务简介 在网络状态变化的时候&#xff08;数据或WiFi&#xff09;&#xff0c;会更新SPN。 基于Android U的代码分析。 分类&#xff1a;SPN Data_Dic-的博客-CSDN博客 功能逻辑 状态说明 飞行模式下注册上WFC的话&#xff0c;注册状态MD上报 regState: NOT_REG_MT_NOT…

IO进线程练习(用到了:文件IO 标准IO 多进程 exec进程转移 有名管道 无名管道)

1 利用文件IO读取文件数据存入链表&#xff0c;当触法ctrlc时将链表数据存入文件。 main.c #include"head.h" FILE*fp_w; linklist L; void handler(int sig){out_file(fp_w,L);printf("文件写入完成\n");exit(0); }int main(int argc, const char *argv…

一文读懂MySQL7大日志(slow、redo、undo、bin、relay、general、error)

Slow Log 简介 用于记录执行时间超过指定值的 SQL 语句的详细信息&#xff0c;多用于调试和监控。 配置 因为开启会略微影响性能&#xff0c;所以默认没有开启&#xff0c;所以需要配置。 查看是否开启 show variables like %slow%; ------------------------------------…

计算机找不到api-ms-win-core-path-l1-1-0的5种解决方法

在计算机使用过程中&#xff0c;我们可能会遇到各种问题&#xff0c;其中之一就是找不到某些系统文件。最近&#xff0c;许多用户反映他们在使用电脑时遇到了“找不到api-ms-win-core-path-l1-1-0文件”的问题。这个问题通常出现在Windows操作系统中&#xff0c;可能会影响到一…

Java外观模式源码剖析及使用场景

外观模式 一、介绍二、家庭影院项目案例使用三、Java API或框架中应用分析三、Spring框架ApplicationContext源码 一、介绍 外观模式(Facade Pattern)是一种结构型设计模式,它为子系统中的一组接口提供了一个统一的高层接口,使得子系统更加容易使用。外观模式定义了一个高层接…