两个 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

相关文章

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

Redis中的AOF原理及分析

《Redis中的AOF原理及分析》Redis的AOF通过记录所有写操作命令实现持久化,支持always/everysec/no三种同步策略,重写机制优化文件体积,与RDB结合可平衡数据安全与恢复效率... 目录开篇:从日记本到AOF一、AOF的基本执行流程1. 命令执行与记录2. AOF重写机制二、AOF的

MyBatis Plus大数据量查询慢原因分析及解决

《MyBatisPlus大数据量查询慢原因分析及解决》大数据量查询慢常因全表扫描、分页不当、索引缺失、内存占用高及ORM开销,优化措施包括分页查询、流式读取、SQL优化、批处理、多数据源、结果集二次... 目录大数据量查询慢的常见原因优化方案高级方案配置调优监控与诊断总结大数据量查询慢的常见原因MyBAT

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

Java 中的 equals 和 hashCode 方法关系与正确重写实践案例

《Java中的equals和hashCode方法关系与正确重写实践案例》在Java中,equals和hashCode方法是Object类的核心方法,广泛用于对象比较和哈希集合(如HashMa... 目录一、背景与需求分析1.1 equals 和 hashCode 的背景1.2 需求分析1.3 技术挑战1.4

Java中实现对象的拷贝案例讲解

《Java中实现对象的拷贝案例讲解》Java对象拷贝分为浅拷贝(复制值及引用地址)和深拷贝(递归复制所有引用对象),常用方法包括Object.clone()、序列化及JSON转换,需处理循环引用问题,... 目录对象的拷贝简介浅拷贝和深拷贝浅拷贝深拷贝深拷贝和循环引用总结对象的拷贝简介对象的拷贝,把一个

Java中最全最基础的IO流概述和简介案例分析

《Java中最全最基础的IO流概述和简介案例分析》JavaIO流用于程序与外部设备的数据交互,分为字节流(InputStream/OutputStream)和字符流(Reader/Writer),处理... 目录IO流简介IO是什么应用场景IO流的分类流的超类类型字节文件流应用简介核心API文件输出流应用文