两个 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 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

RabbitMQ消费端单线程与多线程案例讲解

《RabbitMQ消费端单线程与多线程案例讲解》文章解析RabbitMQ消费端单线程与多线程处理机制,说明concurrency控制消费者数量,max-concurrency控制最大线程数,prefe... 目录 一、基础概念详细解释:举个例子:✅ 单消费者 + 单线程消费❌ 单消费者 + 多线程消费❌ 多

Spring Boot配置和使用两个数据源的实现步骤

《SpringBoot配置和使用两个数据源的实现步骤》本文详解SpringBoot配置双数据源方法,包含配置文件设置、Bean创建、事务管理器配置及@Qualifier注解使用,强调主数据源标记、代... 目录Spring Boot配置和使用两个数据源技术背景实现步骤1. 配置数据源信息2. 创建数据源Be

Olingo分析和实践之EDM 辅助序列化器详解(最佳实践)

《Olingo分析和实践之EDM辅助序列化器详解(最佳实践)》EDM辅助序列化器是ApacheOlingoOData框架中无需完整EDM模型的智能序列化工具,通过运行时类型推断实现灵活数据转换,适用... 目录概念与定义什么是 EDM 辅助序列化器?核心概念设计目标核心特点1. EDM 信息可选2. 智能类

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1

Olingo分析和实践之ODataImpl详细分析(重要方法详解)

《Olingo分析和实践之ODataImpl详细分析(重要方法详解)》ODataImpl.java是ApacheOlingoOData框架的核心工厂类,负责创建序列化器、反序列化器和处理器等组件,... 目录概述主要职责类结构与继承关系核心功能分析1. 序列化器管理2. 反序列化器管理3. 处理器管理重要方

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更