【cuda入门系列】通过代码真实打印线程ID
【cuda入门系列】通过代码真实打印线程ID
- 1.`gridDim(6,1),blockDim(4,1)`
- 2.`gridDim(3,2),blockDim(2,2)`
【cuda入门系列之参加CUDA线上训练营】在Jetson nano本地跑 hello cuda!
【cuda入门系列之参加CUDA线上训练营】一文认识cuda基本概念
【cuda入门系列之参加CUDA线上训练营】共享内存实例1:矩阵转置实现及其优化
【cuda入门系列之参加CUDA线上训练营】共享内存实例2:矩阵相乘
【cuda入门系列】通过代码真实打印线程ID
定义一个长度为24的向量,分别用gridDim(6,1),blockDim(4,1)
以及gridDim(3,2),blockDim(2,2)
的thread去访问,确认thread与向量各元素之间的对应关系。
1.gridDim(6,1),blockDim(4,1)
#include <stdio.h>
#define BLOCK_SIZE 4__global__ void gpu_print(int *a,int m,int n)
{ int row = blockIdx.y * blockDim.y + threadIdx.y; int col = blockIdx.x * blockDim.x + threadIdx.x;printf("%d %d\n", gridDim.x,gridDim.y); printf("%d %d\n", blockDim.x,blockDim.y);printf("blockIdx.y:%d blockIdx.x:%d threadIdx.y:%d threadIdx.x:%d val:%d \n", blockIdx.y,blockIdx.x,threadIdx.y,threadIdx.x,a[row*n+col]);
}int main(int argc, char const *argv[])
{int m=4;int n=6;int *h_a;cudaMallocHost((void **) &h_a, sizeof(int)*m*n);for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {h_a[i * n + j] = i * n + j;}}int *d_a;cudaMalloc((void **) &d_a, sizeof(int)*m*n);cudaMemcpy(d_a, h_a, sizeof(int)*m*n, cudaMemcpyHostToDevice);dim3 dimGrid(6,1);dim3 dimBlock(4,1);gpu_print<<<dimGrid, dimBlock>>>(d_a,m, n); // free memorycudaFree(d_a);cudaFreeHost(h_a);system("pause");return 0;
}
编译后打印结果如下:
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
blockIdx.y:0 blockIdx.x:1 threadIdx.y:0 threadIdx.x:0 val:4
blockIdx.y:0 blockIdx.x:1 threadIdx.y:0 threadIdx.x:1 val:5
blockIdx.y:0 blockIdx.x:1 threadIdx.y:0 threadIdx.x:2 val:6
blockIdx.y:0 blockIdx.x:1 threadIdx.y:0 threadIdx.x:3 val:7
blockIdx.y:0 blockIdx.x:3 threadIdx.y:0 threadIdx.x:0 val:12
blockIdx.y:0 blockIdx.x:3 threadIdx.y:0 threadIdx.x:1 val:13
blockIdx.y:0 blockIdx.x:3 threadIdx.y:0 threadIdx.x:2 val:14
blockIdx.y:0 blockIdx.x:3 threadIdx.y:0 threadIdx.x:3 val:15
blockIdx.y:0 blockIdx.x:2 threadIdx.y:0 threadIdx.x:0 val:8
blockIdx.y:0 blockIdx.x:2 threadIdx.y:0 threadIdx.x:1 val:9
blockIdx.y:0 blockIdx.x:2 threadIdx.y:0 threadIdx.x:2 val:10
blockIdx.y:0 blockIdx.x:2 threadIdx.y:0 threadIdx.x:3 val:11
blockIdx.y:0 blockIdx.x:4 threadIdx.y:0 threadIdx.x:0 val:16
blockIdx.y:0 blockIdx.x:4 threadIdx.y:0 threadIdx.x:1 val:17
blockIdx.y:0 blockIdx.x:4 threadIdx.y:0 threadIdx.x:2 val:18
blockIdx.y:0 blockIdx.x:4 threadIdx.y:0 threadIdx.x:3 val:19
blockIdx.y:0 blockIdx.x:0 threadIdx.y:0 threadIdx.x:0 val:0
blockIdx.y:0 blockIdx.x:0 threadIdx.y:0 threadIdx.x:1 val:1
blockIdx.y:0 blockIdx.x:0 threadIdx.y:0 threadIdx.x:2 val:2
blockIdx.y:0 blockIdx.x:0 threadIdx.y:0 threadIdx.x:3 val:3
blockIdx.y:0 blockIdx.x:5 threadIdx.y:0 threadIdx.x:0 val:20
blockIdx.y:0 blockIdx.x:5 threadIdx.y:0 threadIdx.x:1 val:21
blockIdx.y:0 blockIdx.x:5 threadIdx.y:0 threadIdx.x:2 val:22
blockIdx.y:0 blockIdx.x:5 threadIdx.y:0 threadIdx.x:3 val:23
从代码打印结果来看,一共有blcokDim4*gridDim 6=24
个线程在工作。
- gridDim.x,gridDim.y———grid中x方向、y方向各含有多少个block;
- blockDim.x,blockDim.y——一个block中x方向、y方向各含有多少个thread。
定义的gridDim.x,gridDim.y以及blockDim.x,blockDim.y通过打印结果,可知:
各block中的thread与矩阵中元素的指向关系如下图:
2.gridDim(3,2),blockDim(2,2)
将代码中的
dim3 dimGrid(6,1);
dim3 dimBlock(4,1);
修改为:
dim3 dimGrid(3,2);
dim3 dimBlock(2,2);
其他不变,同样进行编译,打印输出:
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
blockIdx.y:0 blockIdx.x:1 threadIdx.y:0 threadIdx.x:0 val:2
blockIdx.y:0 blockIdx.x:1 threadIdx.y:0 threadIdx.x:1 val:3
blockIdx.y:0 blockIdx.x:1 threadIdx.y:1 threadIdx.x:0 val:8
blockIdx.y:0 blockIdx.x:1 threadIdx.y:1 threadIdx.x:1 val:9
blockIdx.y:1 blockIdx.x:0 threadIdx.y:0 threadIdx.x:0 val:12
blockIdx.y:1 blockIdx.x:0 threadIdx.y:0 threadIdx.x:1 val:13
blockIdx.y:1 blockIdx.x:0 threadIdx.y:1 threadIdx.x:0 val:18
blockIdx.y:1 blockIdx.x:0 threadIdx.y:1 threadIdx.x:1 val:19
blockIdx.y:0 blockIdx.x:2 threadIdx.y:0 threadIdx.x:0 val:4
blockIdx.y:0 blockIdx.x:2 threadIdx.y:0 threadIdx.x:1 val:5
blockIdx.y:0 blockIdx.x:2 threadIdx.y:1 threadIdx.x:0 val:10
blockIdx.y:0 blockIdx.x:2 threadIdx.y:1 threadIdx.x:1 val:11
blockIdx.y:1 blockIdx.x:1 threadIdx.y:0 threadIdx.x:0 val:14
blockIdx.y:1 blockIdx.x:1 threadIdx.y:0 threadIdx.x:1 val:15
blockIdx.y:1 blockIdx.x:1 threadIdx.y:1 threadIdx.x:0 val:20
blockIdx.y:1 blockIdx.x:1 threadIdx.y:1 threadIdx.x:1 val:21
blockIdx.y:0 blockIdx.x:0 threadIdx.y:0 threadIdx.x:0 val:0
blockIdx.y:0 blockIdx.x:0 threadIdx.y:0 threadIdx.x:1 val:1
blockIdx.y:0 blockIdx.x:0 threadIdx.y:1 threadIdx.x:0 val:6
blockIdx.y:0 blockIdx.x:0 threadIdx.y:1 threadIdx.x:1 val:7
blockIdx.y:1 blockIdx.x:2 threadIdx.y:0 threadIdx.x:0 val:16
blockIdx.y:1 blockIdx.x:2 threadIdx.y:0 threadIdx.x:1 val:17
blockIdx.y:1 blockIdx.x:2 threadIdx.y:1 threadIdx.x:0 val:22
blockIdx.y:1 blockIdx.x:2 threadIdx.y:1 threadIdx.x:1 val:23
貌似是先切割y方向,比如此例子中,gridDim.yblockDim.y=22=4,所以将24个元素平分成了4份;然后再在x方向分割。最后组装,由各block中的thread访问。
相关文章:

【cuda入门系列】通过代码真实打印线程ID
【cuda入门系列】通过代码真实打印线程ID1.gridDim(6,1),blockDim(4,1)2.gridDim(3,2),blockDim(2,2)【cuda入门系列之参加CUDA线上训练营】在Jetson nano本地跑 hello cuda! 【cuda入门系列之参加CUDA线上训练营】一文认识cuda基本概念 【cuda入门系列之参加CUDA线…...
【Python语言基础】——Python NumPy 数据类型
Python语言基础——Python NumPy 数据类型 文章目录 Python语言基础——Python NumPy 数据类型一、Python NumPy 数据类型一、Python NumPy 数据类型 Python 中的数据类型 默认情况下,Python 拥有以下数据类型: strings - 用于表示文本数据,文本用引号引起来。例如 “ABCD”…...

数据工程师需要具备哪些技能?
成为数据工程师需要具备哪些技能?数据工程工作存在于各个行业,在银行业、医疗保健业、大型科技企业、初创企业和其他行业找到工作机会。许多职位描述要求数据工程师、拥有数学或工程学位,但如果有合适的经验学位往往没那么重要。 大数据开发…...

Cosmos 基础 -- Ignite CLI(二)Module basics: Blog
一、快速入门 Ignite CLI version: v0.26.1 在本教程中,我们将使用一个模块创建一个区块链,该模块允许我们从区块链中写入和读取数据。这个模块将实现创建和阅读博客文章的功能,类似于博客应用程序。最终用户将能够提交新的博客文章&#x…...

Quartz 快速入门案例,看这一篇就够了
前言 Quartz 是基于 Java 实现的任务调度框架,对任务的创建、修改、删除、触发以及监控这些操作直接提供了 api,这意味着开发人员拥有最大的操作权,也带来了更高的灵活性。 什么是任务调度? 任务调度指在将来某个特定的时间、固…...

图解LeetCode——1233. 删除子文件夹(难道:中等)
一、题目 你是一位系统管理员,手里有一份文件夹列表 folder,你的任务是要删除该列表中的所有 子文件夹,并以 任意顺序 返回剩下的文件夹。 如果文件夹 folder[i] 位于另一个文件夹 folder[j] 下,那么 folder[i] 就是 folder[j] …...

Doris--简单使用
一、数据表的创建与数据导入 1.1、创建表 1.1.1、单分区 CREATE TABLE table1 (siteid INT DEFAULT 10,citycode SMALLINT,username VARCHAR(32) DEFAULT ,pv BIGINT SUM DEFAULT 0 -- 聚合模型, value column 使用sum聚合 ) AGGREGATE KEY(siteid, citycode, …...

使用GPT让你的RStudio如虎添翼
API的的调用目前来说不限制地区,但是OpenAI的API的申请限制了地区。运行的时候,如果出现了429,意味着你被限流了,需要等一会才行。 前提是,你需要注册一个OpenAI的账户,然后在https://openai.com/api/ 里申…...
Python 算法交易实验45 再探量化
说明 去年大部分精力都在构建底层架构和工具了,一直都没有时间搞量化。目前底层的数据库服务(ADB)和清洗(衍生 AETL) 工具已经好了,我想尽快的把量化启动起来。 内容 1 思想 作为交易来说,只有买卖。通过数据分析与模型,我们获得的增强点是决策。在合适的时候进行买卖的…...
Dubbo加载配置文件方式,加载流程,加载配置文件源码解析
配置方法 API配置 以Java编码的方式组织配置,Dubbo3配置API详解 :https://dubbo.apache.org/zh/docs3-v2/java-sdk/reference-manual/config/api/#bootstrap-api public static void main(String[] args) throws IOException {ServiceConfig<Greet…...

十大开源测试工具和框架,一定有你需要的
目录 前言 Katalon Studio Selenium Appium JMeter SOAP UI Robot Framework Watir JUnit Robotium Citrus 总结 前言 免费的开源框架和工具由于其开源特性,现在逐渐成为自动化测试的首选解决方案。区别在于,你是喜欢使用类库编写一个全新的…...
加密技术在android中的应用
1、算法基础 算法基础参照linux的全盘加密与文件系统加密在android中的应用 消息摘要算法 对称加密算法 非对称加密算法...

备战蓝桥杯【一维前缀和】
🌹作者:云小逸 📝个人主页:云小逸的主页 📝Github:云小逸的Github 🤟motto:要敢于一个人默默的面对自己,强大自己才是核心。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前…...

研报精选230214
目录 【行业230214艾瑞股份】中国增强现实(AR)行业研究报告【行业230214国信证券】信息安全深度剖析5:密评和信创双催化,密码产业开启从1到N【行业230214民生证券】磁性元器件深度报告:乘新能源之风,磁性元…...

【SSL/TLS】准备工作:证书格式
证书格式1. 格式说明1.1 文件编码格式1.2 文件后缀格式2. xca导出格式1. 格式说明 1.1 文件编码格式 1. PEM格式: 使用Base 64 ASCII进行编码的纯文本格式。后缀为“.pem”, ".cer", ".crt", ".key" 2. DER格式 二进制编码格式,文件…...

Linux常用命令---系统常用命令
Linux系统常用命令场景一: 查看当前系统内核版本相关信息场景二: sosreport 命令场景三: 如何定位并确定命令?场景四:查看当前系统运行负载怎场景五: 查看当前系统的内存可用情况场景六:查看网卡…...
C 结构体
C 数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。结构用于表示一条记录,假设您想要跟踪图书馆中书本的动态,您可能需要跟踪每本书的下列属性ÿ…...

手语检测识别
论文:Real-Time Sign Language Detection using Human Pose Estimation Github:https://github.com/google-research/google-research/tree/master/sign_language_detection SLRTP 2020 手语识别任务包括手语检测(Sign language detection&a…...

android fwk模块之Sensor架构
本文基于Android 12源码整理,包含如下内容: 通信架构应用层实现使用方式SensorManager抽象接口具体实现fwk层的实现native中的SensorManager的初始化流程native中的消息队列初始化与数据读取sensorservice实现HAL层的实现通信架构 应用层实现 涉及代码&…...

安装less-loader5出现webpack版本不兼容
今天遇到一个问题: 安装less-loader5之后其它包提示peerDependencies WARNING,意思是包版本不兼容。 【难题】 虽然NPM已经很自动化了,但依赖问题真的是一个难题,无法自动解决,需要人工干预调整。 【解决办法】 去查…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...