热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CUDA代码中‘ld’和‘add’指令参数不匹配问题

探讨CUDA代码中的内联汇编指令‘ld’和‘add’为何出现参数不匹配的编译错误,并提供解决方案。

在CUDA编程中,有时会遇到内联汇编指令‘ld’和‘add’参数不匹配的问题。具体来说,以下代码段展示了这一问题:

__global__ void access(double *posArray) {
uint32_t tid = threadIdx.x;
double sink = 0;
for(uint32_t i = tid; i double* ptr = posArray + i;
asm volatile("{ \n"
".reg .f32 data;\n\t"
"ld.global.ca.f64 data, [%1];\n\t"
"add.f64 %0, data, %0;\n\t"
"}" : "+d"(sink) : "l"(ptr) : "memory");
}
// 同步所有线程
asm volatile("bar.sync 0;");
for(uint32_t i = 0; i double* ptr = posArray + i;
// 每个warp加载L1缓存中的所有数据
for(uint32_t j = 0; j uint32_t offset = (tid + j) % THREADS_NUM;
asm volatile("{ \n"
".reg .f64 data;\n\t"
"ld.global.ca.f64 data, [%1];\n\t"
"add.f64 %0, %0, data;\n\t"
"}" : "+d"(sink) : "l"(ptr + offset) : "memory");
}
}
}

编译时会出现以下错误:

ptxas /tmp/tmpxft_00003451_00000000-5_l1.ptx, line 63; error: Arguments mismatch for instruction 'ld'
ptxas /tmp/tmpxft_00003451_00000000-5_l1.ptx, line 64; error: Arguments mismatch for instruction 'add'

这些错误提示‘ld’和‘add’指令的参数不匹配。具体原因在于以下行:

.reg .f32 data;\n\t

应更改为:

.reg .f64 data;\n\t

因为‘ld.global.ca.f64’和‘add.f64’指令都操作64位浮点数(.f64),而不是32位浮点数(.f32)。正确的代码如下:

__global__ void access(double *posArray) {
uint32_t tid = threadIdx.x;
double sink = 0;
for(uint32_t i = tid; i double* ptr = posArray + i;
asm volatile("{ \n"
".reg .f64 data;\n\t"
"ld.global.ca.f64 data, [%1];\n\t"
"add.f64 %0, data, %0;\n\t"
"}" : "+d"(sink) : "l"(ptr) : "memory");
}
// 同步所有线程
asm volatile("bar.sync 0;");
for(uint32_t i = 0; i double* ptr = posArray + i;
// 每个warp加载L1缓存中的所有数据
for(uint32_t j = 0; j uint32_t offset = (tid + j) % THREADS_NUM;
asm volatile("{ \n"
".reg .f64 data;\n\t"
"ld.global.ca.f64 data, [%1];\n\t"
"add.f64 %0, %0, data;\n\t"
"}" : "+d"(sink) : "l"(ptr + offset) : "memory");
}
}
}

通过将寄存器类型从.f32更改为.f64,可以解决参数不匹配的问题,使代码能够正确编译和运行。


推荐阅读
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • C语言中全部可用的数学函数有哪些?2.longlabs(longn);求长整型数的绝对值。3.doublefabs(doublex);求实数的绝对值。4.doublefloor(d ... [详细]
  • 本文介绍了几种常用的图像相似度对比方法,包括直方图方法、图像模板匹配、PSNR峰值信噪比、SSIM结构相似性和感知哈希算法。每种方法都有其优缺点,适用于不同的应用场景。 ... [详细]
  • 在分析Android的Audio系统时,我们对mpAudioPolicy->get_input进行了详细探讨,发现其背后涉及的机制相当复杂。本文将详细介绍这一过程及其背后的实现细节。 ... [详细]
  • 单片机入门指南:基础理论与实践
    本文介绍了单片机的基础知识及其应用。单片机是一种将微处理器(类似于CPU)、存储器(类似硬盘和内存)以及多种输入输出接口集成在一块硅片上的微型计算机系统。通过详细解析其内部结构和功能,帮助初学者快速掌握单片机的基本原理和实际操作方法。 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 本文探讨了如何通过编程手段在Linux系统中禁用硬件预取功能。基于Intel® Core™微架构的应用性能优化需求,文章详细介绍了相关配置方法和代码实现,旨在帮助开发人员有效控制硬件预取行为,提升应用程序的运行效率。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
  • 通过将常用的外部命令集成到VSCode中,可以提高开发效率。本文介绍如何在VSCode中配置和使用自定义的外部命令,从而简化命令执行过程。 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • 检查在所有可能的“?”替换中,给定的二进制字符串中是否出现子字符串“10”带 1 或 0 ... [详细]
  • 如何使用 `org.apache.tomcat.websocket.server.WsServerContainer.findMapping()` 方法及其代码示例解析 ... [详细]
author-avatar
妈妈说称号长的人很牛也
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有