测试CUDA __threadfence的行为

news2024/9/25 9:41:26

CUDA __threadfence测试

  • 一.测试小结
  • 二.复现过程
  • 三.截图

测试CUDA __threadfence的行为

一.测试小结

  • 测例0:没有任何同步,执行到left+=t0时,left的数据未加载完成,出现long soreboard的stall 405次
  • 测例1:__threadfence会等待memory数据加载完成,left+=t0没有出现long scoreboard的stall
  • 测例2:fence.proxy.alias相当于执行二次__threadfence
  • 测例3:__syncthreads不会等待memory数据加载完成.因此,执行到left+=t0时,会出现stall

二.复现过程

tee threadfence_test.cu<<-'EOF'
#include <iostream>
#include <cuda_runtime.h>
#include <iostream>
#include <vector>
#include <stdio.h>
#include <assert.h>
#include <cstdio>
#include <cuda.h>

#define CHECK_CUDA(call)                                           \
    do {                                                           \
        cudaError_t err = call;                                    \
        if (err != cudaSuccess) {                                  \
            std::cerr << "CUDA error at " << __FILE__ << ":" << __LINE__; \
            std::cerr << " code=" << err << " (" << cudaGetErrorString(err) << ")" << std::endl; \
            exit(EXIT_FAILURE);                                    \
        }                                                          \
    } while (0)


__global__ void kernel_add_float_0(float *addr)
{
    unsigned int tid  = threadIdx.x + blockIdx.x * blockDim.x;
    float left=addr[tid]*tid;
    float t0=(float)clock64();
    left+=t0;
    addr[tid]=left;
}
__global__ void kernel_add_float_1(float *addr)
{
    unsigned int tid  = threadIdx.x + blockIdx.x * blockDim.x;
    float left=addr[tid]*tid;
    __threadfence();
    float t0=(float)clock64();
    left+=t0;
    addr[tid]=left;
}
__global__ void kernel_add_float_2(float *addr)
{
    unsigned int tid  = threadIdx.x + blockIdx.x * blockDim.x;
    float left=addr[tid]*tid;
    asm volatile ("fence.proxy.alias;" ::: "memory");
    float t0=(float)clock64();
    left+=t0;
    addr[tid]=left;
}
__global__ void kernel_add_float_3(float *addr)
{
    unsigned int tid  = threadIdx.x + blockIdx.x * blockDim.x;
    float left=addr[tid]*tid;
    __syncthreads();
    float t0=(float)clock64();
    left+=t0;
    addr[tid]=left;
}
int main(int argc,char *argv[])
{
    int deviceid=0;cudaSetDevice(deviceid);  
    int block_count=28;int block_size=32*4;
    int thread_size=block_count*block_size;
    {
        float *addr;CHECK_CUDA(cudaMalloc(&addr, thread_size*4));
        printf("%-64s:","cudaMalloc");
        kernel_add_float_0<<<block_count, block_size>>>(addr);CHECK_CUDA(cudaDeviceSynchronize());
        kernel_add_float_1<<<block_count, block_size>>>(addr);CHECK_CUDA(cudaDeviceSynchronize());
        kernel_add_float_2<<<block_count, block_size>>>(addr);CHECK_CUDA(cudaDeviceSynchronize());
        kernel_add_float_3<<<block_count, block_size>>>(addr);CHECK_CUDA(cudaDeviceSynchronize());
    }    
}
EOF
/usr/local/cuda/bin/nvcc -std=c++17 -arch=sm_86 -lineinfo  -o threadfence_test threadfence_test.cu -I /usr/local/cuda/include -L /usr/local/cuda/lib64 -lcuda
/usr/local/NVIDIA-Nsight-Compute/ncu --warp-sampling-interval 0 --set full --target-processes all --export ncu_report_threadfence_test -f ./threadfence_test

三.截图

  • 测例0
    在这里插入图片描述

  • 测例1
    在这里插入图片描述

  • 测例2
    在这里插入图片描述

  • 测例3
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2110221.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于golang实现简单的文件监控

基于golang实现简单的文件监控 package mainimport ("log""syscall""unsafe" )type FileNotifyInformation struct {Action uint32Name string }func Fswatch(path string) (chan FileNotifyInformation, error) {handle, err : syscall.Crea…

vscode中暂存块功能不能用了

vscode中暂存文件修改可以按每一处暂存&#xff0c;而不用一次暂存整个文件的修改&#xff0c;今天发现这个功能不能用了&#xff0c;不知道啥原因&#xff0c;记录一下。

华晨宇火星演唱会三登鸟巢 升级国风四面台引期待

2024华晨宇火星演唱会北京站即将于9月7日、9月8日在鸟巢举办&#xff0c;今年华晨宇将再度带着四面台回归鸟巢&#xff0c;升级后的舞台将融入国风元素&#xff0c;为歌迷带来一场前所未有的视听盛宴。这将是他第三次踏足鸟巢的舞台&#xff0c;更是他音乐旅程的里程碑。 2018年…

性能测试经典案例解析——政务查询系统

各位好&#xff0c;我是 道普云 一站式云测试SaaS平台。一个在软件测试道路上不断折腾十余年的萌新。 欢迎关注我的主页 道普云 文章内容具有一定门槛&#xff0c;建议先赞再收藏慢慢学习&#xff0c;有不懂的问题欢迎私聊我。 希望这篇文章对想提高软件测试水平的你有所帮…

【最新综述】基于机器学习的超声焊接缺陷无损检测

Machine learning for ultrasonic nondestructive examination of welding defects: A systematic review ABSTRACT 近年来&#xff0c;机器学习&#xff08;ML&#xff09;在无损检测&#xff08;NDE&#xff09;数据自动分析中的应用大幅增加。其中一个值得关注的应用是使用…

JS_阿里云oss视频上传后,如何获取视频封面

当您需要获取视频封面、提取视频关键帧图像进行视频编辑&#xff0c;或者提取视频中特定场景帧图像用于视频监控等时&#xff0c;可以将视频上传至OSS存储空间&#xff0c;然后通过本文所示方法进行视频截帧。 使用示例 本文示例使用的Bucket为杭州地域名为oss-console-img-de…

基于WhatsApp打造高效的CRM系统

背景 在 2023 年的统计数据中&#xff0c;WhatsApp 成为了印尼最常用的社交媒体&#xff0c;拥有高达 2.2 亿的用户量&#xff0c;占据印尼互联网人群的 90%之多。 WhatsApp 开发的 WhatsApp Business API 为企业开辟了一条与客户进行大规模、高效且合规沟通的崭新途径。它使…

美联储降息在即:加密市场风云再起,机遇与挑战并存

随着全球金融市场日益与加密货币市场的波动紧密相连&#xff0c;美联储的货币政策调整正成为加密市场的重要风向标。今年以来&#xff0c;比特币等主流加密货币反复跟随全球市场震荡&#xff0c;宏观经济指标对加密市场的影响愈加显著。尤其是美国联邦基金利率的变动&#xff0…

【QA】软件产品在确定使用期限时应关注哪些问题?

版权说明&#xff1a;本文来源【国家药品监督管理局】&#xff0c;如果您认为我们的文中描述与事实不符或有侵权行为&#xff0c;请及时联系我们。感谢您的关注。

2025届必备:如何打造Java SpringBoot大型超市数据处理系统,提升管理效率,最新攻略!

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

生信软件33 - Wgsim生成双端(PE) fastq模拟数据

1. Wgsim&#xff08;Whole genome simulation&#xff09;简介 wgsim是可用于高通量数据模拟的软件&#xff0c;可以模拟出illumina测序数据&#xff0c;并且可以自由调整测序reads的读长&#xff0c;插入片段大小以及错误率等&#xff0c; 是开发BWA等大牛Li heng编写的基因…

Windows bat脚本学习九(srec_cat)

一、简介 srec_cat是一个在嵌入式开发中&#xff0c;使用非常频繁的软件&#xff0c;这里做个常用功能的介绍。 二、常用参数 文件类型 在使用srec_cat指令时&#xff0c;在输入文件和输出文件时&#xff0c;要指明文件的类型&#xff0c;如&#xff1a; input.hex -intel …

木舟0基础学习Java的第二十六天(JavaWeb)

设置响应头 resp.setHeader("key","nihao");//推荐使用英文 中文会乱码 案例&#xff1a;模拟登录 jdbc.properties driverClasscom.mysql.jdbc.Driver urljdbc:mysql://localhost:3306/test?verifyServerCertificatefalse&useSSLfalse nameroot p…

Qt:玩转QPainter后转之太极图(步骤详细、包含源码)

前言 简单了解了QPainter之后还是要做两个小例子练一练&#xff0c;不实际去做&#xff0c;只看看函数是没啥太大提升的&#xff0c;这里就简单画一个太极图。 正文 我们都知道太极分为阴阳鱼两部分&#xff0c;阴鱼(黑色)有个白色鱼眼&#xff0c;阳鱼(白色)有个黑色鱼眼&am…

Notes,无代码应用开发王者归来!

大家好&#xff0c;才是真的好。 连续一个星期都在讲HCL Notes Domino 14.5 EAP1&#xff0c;大家是不是已经感到疲惫了&#xff1f;和大家一样&#xff0c;我并没有。 因此&#xff0c;看了一下9月4号晚上的HCL Notes Domino 14.5 EAP1在线广播回顾&#xff0c;发现了几个大…

模拟RabbitMQ实现消息队列【项目】

文章目录 1. 项目介绍什么是RabbitMQ&#xff1f; 2. 开发环境3. 技术选型3.1ProtoBuf使用介绍&#xff1a;3.2 Muduo库3.3 SQLite3什么是SQLIte&#xff1f;为什么要用SQLite&#xff1f; 3.4 Gtest什么是Gtest 4. 需求分析4.1 核心概念4.2 核心API4.3 交换机类型4.4 持久化4.…

UVa1389/LA3709 Hard Life

UVa1389/LA3709 Hard Life 题目链接题意输入格式输出格式 分析AC 代码 题目链接 本题是2006年icpc欧洲区域赛东北欧赛区的H题 题意 约翰是一家公司的CEO。公司的股东决定让他的儿子斯科特成为公司的经理。约翰十分担心&#xff0c;儿子会因为在经理岗位上表现优异而威胁到他CE…

IPv4地址学习

今天学习了IPv4&#xff0c;做下学习笔记&#xff1a; 什么是IPv4&#xff1f; IPv4地址是网络层地址&#xff0c;用于标识网络中的每个节点。 什么是子网&#xff1f;什么是主类子网划分&#xff1f; 我们将IP地址划分为网络位和主机位 一个地址为192.168.1.2/24&#xff…

【HTML】置换元素(替换元素)

● 它的内容不是由元素的标签内的内容决定的,而是由元素的属性决定的 ● 可以通过CSS设置宽度和高度。 常见的置换元素主要包括以下几种: <img> 元素:用于嵌入图像,通过 src 属性指定图像的路径。例如:<img src="example.jpg" alt="示例图片&quo…

场景感知技术带您重塑未来生活的新篇章

在科技日新月异的今天&#xff0c;场景感知技术正以前所未有的速度渗透到我们生活的方方面面&#xff0c;成为连接物理世界与数字世界的桥梁&#xff0c;重塑着人类的认知方式与生活体验。这项技术通过综合运用传感器、大数据分析、人工智能等前沿科技&#xff0c;实现对周围环…