首页 > 编程语言 >摩尔线程 国产显卡 MUSA 并行编程 学习笔记-2024/11/28

摩尔线程 国产显卡 MUSA 并行编程 学习笔记-2024/11/28

时间:2024-11-28 19:32:36浏览次数:11  
标签:11 threadIdx MUSA 28 per 2024 blockIdx 线程 block

Learning Roadmap:

Section 1: Intro to Parallel Programming & MUSA

  1. Deep Learning Ecosystem(摩尔线程国产显卡 MUSA 并行编程学习笔记-2024/11/20
  2. Ubuntu+Driver+Toolkit+conda+pytorch+torch_musa环境安装(摩尔线程国产显卡 MUSA 并行编程学习笔记-2024/11/24-CSDN博客
  3. C/C++ Review(摩尔线程国产显卡 MUSA 并行编程学习笔记-2024/11/22-CSDN博客
  4. GPU intros(摩尔线程国产显卡 MUSA 并行编程学习笔记-2024/11/25-CSDN博客
  5. GPU硬件架构 (摩尔线程国产显卡 MUSA 并行编程学习笔记-2024/11/26-CSDN博客)
  6. Write First Kernels (Here)(2024/11/27-线程层级)
  7. MUSA API
  8. Faster Matrix Multiplication
  9. Triton
  10. Pytorch Extensions(摩尔线程国产显卡 MUSA 并行编程学习笔记-2024/11/21-CSDN博客
  11. MNIST Multilayer Perceptron

Section 2: Parallel Programming & MUSA in Depth

  1. Analyzing Parallel Program Performance on a Quad-Core CPU
  2. Scheduling Task Graphs on a Multi-Core CPU
  3. A Simple Renderer in MUSA
  4. Optimizing DNN Performance on DNN Accelerator Hardware
  5. llm.c

Ref:

摩尔学院 

https://www.youtube.com/watch?v=86FAWCzIe_4&t=1012s

https://www.youtube.com/watch?v=V1tINV2-9p4

https://gfxcourses.stanford.edu/cs149/fall24

First MUSA Program to Count Thread

Ref: 2024/11/27 线程层级 | High-Performance Computing with GPUs

2024/11/27 线程层级上一次记到了,GPU上的线程层级,本次将通过写一个基于MUSA的kernel,在过程中具象化ThreadId,BlockId,与BlockDim等概念

代码地址

MUSA PLAY GROUND - Github

代码

#include <stdio.h>

__global__ void whoami(void) {
    int block_id =
        blockIdx.x +    // apartment number on this floor (points across)
        blockIdx.y * gridDim.x +    // floor number in this building (rows high)
        blockIdx.z * gridDim.x * gridDim.y;   // building number in this city (panes deep)

    int block_offset =
        block_id * // times our apartment number
        blockDim.x * blockDim.y * blockDim.z; // total threads per block (people per apartment)

    int thread_offset =
        threadIdx.x +  
        threadIdx.y * blockDim.x +
        threadIdx.z * blockDim.x * blockDim.y;

    int id = block_offset + thread_offset; // global person id in the entire apartment complex

    printf("%04d | Block(%d %d %d) = %3d | Thread(%d %d %d) = %3d\n",
        id,
        blockIdx.x, blockIdx.y, blockIdx.z, block_id,
        threadIdx.x, threadIdx.y, threadIdx.z, thread_offset);
    // printf("blockIdx.x: %d, blockIdx.y: %d, blockIdx.z: %d, threadIdx.x: %d, threadIdx.y: %d, threadIdx.z: %d\n", blockIdx.x, blockIdx.y, blockIdx.z, threadIdx.x, threadIdx.y, threadIdx.z);
}

int main(int argc, char **argv) {
    const int b_x = 2, b_y = 3, b_z = 4;
    const int t_x = 4, t_y = 4, t_z = 4; // the max warp size is 32, so 
    // we will get 2 warp of 32 threads per block

    int blocks_per_grid = b_x * b_y * b_z;
    int threads_per_block = t_x * t_y * t_z;

    printf("%d blocks/grid\n", blocks_per_grid);
    printf("%d threads/block\n", threads_per_block);
    printf("%d total threads\n", blocks_per_grid * threads_per_block);

    dim3 blocksPerGrid(b_x, b_y, b_z); // 3d cube of shape 2*3*4 = 24
    dim3 threadsPerBlock(t_x, t_y, t_z); // 3d cube of shape 4*4*4 = 64

    whoami<<<blocksPerGrid, threadsPerBlock>>>();
    musaDeviceSynchronize();
}

编译

    mcc 01_indexing.mu -o indexing -mtgpu -O2 -lmusart

    ./indexing

通过如上指令,我们将01_indexing.mu进行编译,并执行。其中 -O2是gcc的标准优化项,            -lmusart则连接了musa的运行时库,

GridDim

在这个代码里面我们定义了2*3*4的Grid,每个Grid中有24个block

BlockDim

每个Block的维度为4*4*4,每个Block里面有64个Thread

ThreadNum

基于blocks per grid 与threads per block我们得到了Thread的总数:24*64 = 1536

ThreadId

如代码所示,基于每个block的坐标与thread的坐标我们计算出了block offset与thread offset,通过将两者相加我们得到了thread的全局唯一id

输出结果

输出结果也符合我们的预期

标签:11,threadIdx,MUSA,28,per,2024,blockIdx,线程,block
From: https://blog.csdn.net/weixin_47469677/article/details/144111698

相关文章

  • 2024.11.28
    DPP1048[NOIP2005普及组]采药-洛谷|计算机科学教育新生态#include<iostream>usingnamespacestd;intt[101],w[101];intdp[1001];intmain(){intT,M;cin>>T>>M;for(inti=1;i<=M;i++){cin>>t[i]>>w[i];}......
  • 2024.11.20训练记录
    pack设当前手上的钱数为x。二分一段一段跳的复杂度是对的。因为,如果下一段的代价总和sum<\dfrac{x}{2}。那么这一段的下一个数肯定也小于\dfrac{x}{2}。因为是从大到小排。所以还能继续选下一个数,引出矛盾。所以每段的代价总和只能大于\dfrac{x}{2}。那段数就是log级别的。......
  • 20222407 2024-2025-1 《网络与系统攻防技术》实验五实验报告
    1.实验内容1.1本周内容总结使用了Metasploit框架,其是一个功能强大的渗透测试框架。在使用的过程当中,Metasploit提供了种类繁多的攻击模块,涵盖了远程代码执行、服务拒绝、提权等多种攻击方式,支持对多种操作系统和应用程序进行测试。除了漏洞利用,它还具备强大的后渗透功能,如键......
  • noip2024 复习计划
    大致分三步:基本模板、套路复习套题复盘再刷一两道码力题基本模板复习有(参照csp2024套题复盘表):1.数据结构平衡树线段树、树状数组的Trick2.杂算法CDQ分治、整体二分、点分治、点分树KMP(其实不用复习了)3.图论Dijkstra板子,以及最小生成树......
  • 20222404 2024-2025-1 《网络与系统攻防技术》实验五实验报告
    1.实验内容总结一下本周学习内容了解了信息搜集在网络攻防中的重要性,认识不同的信息搜集方法如WHOIS查询、DNS查询(dig、nslookup等)了解一些查询工具:dig工具、nslookup基于网络的信息搜集可以使用nmap,可使用端口、SYN、UDP等不通类型扫描。2.实验过程2.1获取baidu.com如......
  • 触觉智能亮相OpenHarmony人才生态大会2024
    11月27日,OpenHarmony人才生态大会2024在武汉隆重举行。本次大会汇聚了政府领导、学术大咖、操作系统技术专家、高校及企业代表,围绕新时代背景下的操作系统人才培养进行了深入探讨,分享高校、企业在产学研融合方面的先进经验,全面展现了OpenHarmony在人才生态领域学-考-用-赛-留各环......
  • 20222415 2024-2025-1 《网络与系统攻防技术》实验五实验报告
    1.实验内容本周学习了Web安全。2.实验过程(1)从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取如下信息:DNS注册人及联系方式Registrar:MarkMonitorInc.RegistrarAbuseContactEmail:abusecomplaints@markmonitor.comRegistrarAbuseContactP......
  • 【2024最新】小白如何自学网络安全,零基础入门到精通,看这一篇就够了!
    小白人群想学网安但是不知道从哪入手?一篇文章告诉你如何在4个月内吃透网安课程,掌握网安技术一、基础阶段1.了解网安相关基础知识了解中华人民共和国网络安全法、熟知网络安全的相关概念:包括信息安全、风险管理、网络攻防原理、认证与加密等基本概念,2. Linux操作系统Linux......
  • 『模拟赛』多校A层冲刺NOIP2024模拟赛27终结篇
    Rankrp++A.【模板】分治FFT签。没取模挂50pts。列出式子发现无论何种合并方式,最终权值均为\(\sum_{i=1}^n\a_i\times(\sum_{j=i}^n\a_i)\),因此求方案数即可。发现每一步相当于从当前堆数中任选两个出来,容易得出方案数为\(\prod_{i=2}^{n}\binom{i}{2}\)。时间复杂度......
  • leetcode1109. 航班预订统计
    1109.航班预订统计这道题使用暴力解法,如果数据比较多,first和second跨度比较大时会超时。比如下面这个暴力解:classSolution{public:vector<int>corpFlightBookings(vector<vector<int>>&bookings,intn){vector<int>res(n,0);intsize=boo......