两个 SASS 分分析案例

2024-06-14 18:36
文章标签 分析 案例 两个 sass

本文主要是介绍两个 SASS 分分析案例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. shfl_sync的 机器 sass 汇编代码

1.1 实验目标

对比

    int ret = __shfl_sync(0xFFFFFFFF, value, 5, 16);

    int ret = __shfl_sync(0xFFFFFFFF, value, 5, 32);

不同的 sass 汇编代码

1.2 实验代码

源代码 shfl 16:

shft_sync_test_16.cu

#include <iostream>
#include <stdio.h>__global__ static void shfffl_test(int *A)
{int tid = threadIdx.x;int value = tid;int ret = __shfl_sync(0xFFFFFFFF, value, 5, 16);A[tid] = ret;
}int main()
{int *A = nullptr;int *A_h = nullptr;cudaMalloc((void**)&A, 32*sizeof(int));A_h = (int*)malloc(32*sizeof(int));for(int i=0; i<32; i++)A_h[i] = i*3;cudaMemcpy(A, A_h, 32*sizeof(int), cudaMemcpyHostToDevice);shfffl_test<<<1, 32>>>(A);cudaDeviceSynchronize();cudaMemcpy(A_h, A, 32*sizeof(int), cudaMemcpyDeviceToHost);for(int i=0; i<32; i++)std::cout<<A_h[i]<<"  "<<std::endl;return 0;
}

编译运行:

$ nvcc shft_sync_test_16.cu  -o  ./shfl_sync_test_16.out

$ ./shfl_sync_test_16.out

源代码 shfl 32:

shfl_sync_test_32.cu

#include <iostream>
#include <stdio.h>__global__ static void shfffl_test(int *A)
{int tid = threadIdx.x;int value = tid;int ret = __shfl_sync(0xFFFFFFFF, value, 5, 32);A[tid] = ret;
}int main()
{int *A = nullptr;int *A_h = nullptr;cudaMalloc((void**)&A, 32*sizeof(int));A_h = (int*)malloc(32*sizeof(int));for(int i=0; i<32; i++)A_h[i] = i*3;cudaMemcpy(A, A_h, 32*sizeof(int), cudaMemcpyHostToDevice);shfffl_test<<<1, 32>>>(A);cudaDeviceSynchronize();cudaMemcpy(A_h, A, 32*sizeof(int), cudaMemcpyDeviceToHost);for(int i=0; i<32; i++)std::cout<<A_h[i]<<"  ";std::cout<<std::endl;return 0;
}

编译运行:

$ nvcc shft_sync_test_32.cu  -o  ./shfl_sync_test_32.out

$ ./shfl_sync_test_32.out

分别执行 cuobjdump -sass xxx.cubin,可以查看器中的机器汇编 sass:

1.3 实验结论

先说结论:

猜测,16个线程一组,warp 分为两组做shfl_sync,与warp 内 32 个线程一大组做 shfl_sync,都是使用一条指令完成;

而不是两条。(为什么可能是两条呢?)如果2*16个线程之间,每16一组,硬件无法跨组传递数据,那么,这里的两种情况,其代码会不一样。

    int ret = __shfl_sync(0xFFFFFFFF, value, 5, 16);

    int ret = __shfl_sync(0xFFFFFFFF, value, 5, 32);

汇编的不同之处仅仅是最后的参数立即数不同。

32个 warp 线程 shfl_sync 时,立即数参数为 0x1f;

16 个 warp 线程 shfl_sync 时,立即数参数为 0x101f;

但是汇编机器码稍有差别:

/* 0xef17407c30570400 */

/* 0xef17007c30570400 */

其中的数字5,是指warp lane-id == 5 的线程做 shfl 广播;

这里例子是做广播,相对简单。

接下来测试一下 shfl_sync_down 的响应情况;

上例的Makefile:

OUT := 	shfl_sync_test_08.cubin \shfl_sync_test_08.out 	\shfl_sync_test_16.cubin \shfl_sync_test_16.out 	\shfl_sync_test_32.cubin \shfl_sync_test_32.outall: $(OUT)%.out: %.cunvcc $< -o $@%.cubin: %.cunvcc -cubin $< -o $@.PHONY: clean
clean:-rm -rf $(OUT)

2, shfl_sync_up的 机器 sass 汇编代码

这篇关于两个 SASS 分分析案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1061200

相关文章

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

《MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固通俗易懂版)》本文主要讲解了MySQL中的多表查询,包括子查询、笛卡尔积、自连接、多表查询的实现方法以及多列子查询等,通过实际例子和操... 目录复合查询1. 回顾查询基本操作group by 分组having1. 显示部门号为10的部门名,员

MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析

《MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析》本文将详细讲解MyBatis-Plus中的lambdaUpdate用法,并提供丰富的案例来帮助读者更好地理解和应... 目录深入探索MyBATis-Plus中Service接口的lambdaUpdate用法及示例案例背景

MyBatis-Plus中静态工具Db的多种用法及实例分析

《MyBatis-Plus中静态工具Db的多种用法及实例分析》本文将详细讲解MyBatis-Plus中静态工具Db的各种用法,并结合具体案例进行演示和说明,具有很好的参考价值,希望对大家有所帮助,如有... 目录MyBATis-Plus中静态工具Db的多种用法及实例案例背景使用静态工具Db进行数据库操作插入

java两个List的交集,并集方式

《java两个List的交集,并集方式》文章主要介绍了Java中两个List的交集和并集的处理方法,推荐使用Apache的CollectionUtils工具类,因为它简单且不会改变原有集合,同时,文章... 目录Java两个List的交集,并集方法一方法二方法三总结java两个List的交集,并集方法一

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C

MySQL表锁、页面锁和行锁的作用及其优缺点对比分析

《MySQL表锁、页面锁和行锁的作用及其优缺点对比分析》MySQL中的表锁、页面锁和行锁各有特点,适用于不同的场景,表锁锁定整个表,适用于批量操作和MyISAM存储引擎,页面锁锁定数据页,适用于旧版本... 目录1. 表锁(Table Lock)2. 页面锁(Page Lock)3. 行锁(Row Lock

Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)

《Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)》本文介绍了如何使用Python和Selenium结合ddddocr库实现图片验证码的识别和点击功能,感兴趣的朋友一起看... 目录1.获取图片2.目标识别3.背景坐标识别3.1 ddddocr3.2 打码平台4.坐标点击5.图

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动