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

为多个SIMD架构生成代码

如何解决《为多个SIMD架构生成代码》经验,为你挑选了2个好方法。

我编写了一个库,我使用CMake来验证MMX,SSE,SSE2,SSE4,AVX,AVX2和AVX-512的标头是否存在.除此之外,我检查是否存在指令,如果存在,我添加必要的编译器标志,-msse2 -mavx -mfma等.

这一切都非常好,但我想部署一个二进制文件,它适用于各代处理器.

问题:是否有可能告诉编译器(GCC)每当使用SIMD优化函数时,它必须为架构列表生成代码?当然还有高级分支机构

我在想类似于编译器如何为函数生成代码,其中输入指针是4或8字节对齐的.为了防止这种情况,我使用__builtin_assume_aligned宏.

什么是最佳做法?多个二进制文件?命名?



1> nemequ..:

只要你不关心可移植性,是的.

最近的GCC版本比使用target_clones函数属性我知道的任何其他编译器更容易.只需添加属性,以及要为其创建版本的目标列表,GCC将自动创建不同的变体,以及在运行时自动选择版本的调度函数.

如果你想要更多的可移植性,你可以使用target属性,clang和icc也支持,但你必须自己编写调度函数(这并不难),并多次发出函数(通常使用一个宏,或反复包括标题).

AFAIK,如果您希望代码与MSVC一起使用,则需要使用不同选项的多个编译器调用.



2> Tim..:

如果您只是在说要让编译器生成SSE / AVX等指令,并且您有“通用”代码(即您没有使用内在函数进行显式矢量化,或者有很多代码可供编译器发现和使用)。自动向量化),那么我应该警告您,编译整个代码库的AVX,AVX2或AVX512的运行速度可能会比SSE版本的编译速度慢得多。

当检测到使用寄存器的上半部分的AVX操作码时,CPU会为电路的上半部加电(否则将断电)。这会消耗更多的功率,产生更多的热量并降低芯片的基本时钟速度,具体取决于高功率和低功率操作码的混合,通常会降低10-20%,因此您可能会立即失去15%的性能,然后在开始发现任何收益之前,要进行很多矢量化处理,以弥补此性能缺陷。

请参阅此线程中我的详细解释和参考。

另一方面,如果您正在使用内在函数进行显式矢量化并且您确定具有足够大的AVX爆发等特性,那么我已经成功编写了代码,告诉MSVC为SSE2编译(x64的默认设置),但是然后我会动态检查CPU功能,并将某些功能切换到使用AVX内在函数实现的代码路径。

MSVC允许这样做(它会产生警告,但您可以使这些警告消失),但是在GCC 4.9下很难使用相同的技术,因为仅当使用适当的代码生成标志时,编译器才声明内在函数。[更新:@nemequ下面说明如何使用属性装饰功能在gcc下进行此工作]根据GCC的版本,您可能必须编译带有不同标志的文件才能获得可用的系统。

哦,您还必须注意AVX-SSE转换(当您离开代码的AVX部分以返回SSE代码时,请致电VZEROUPPER)-可以做到,但是我发现了解CPU的影响比我本来要大设想的。


推荐阅读
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • CentOS7.8下编译muduo库找不到Boost库报错的解决方法
    本文介绍了在CentOS7.8下编译muduo库时出现找不到Boost库报错的问题,并提供了解决方法。文章详细介绍了从Github上下载muduo和muduo-tutorial源代码的步骤,并指导如何编译muduo库。最后,作者提供了陈硕老师的Github链接和muduo库的简介。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 原文地址http://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/最开始时 ... [详细]
  • 【技术分享】一个 ELF 蠕虫分析
    【技术分享】一个 ELF 蠕虫分析 ... [详细]
  • 第三周读书笔记《程序员的自我修养》  计划对这本书是精读,这周读了3,4章。第三章目标文件里有什么  首先介绍了目标文件的格式,Windows下是pe-coff, ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 本文介绍了2020年计算机二级MSOffice的选择习题及答案,详细解析了操作系统的五大功能模块,包括处理器管理、作业管理、存储器管理、设备管理和文件管理。同时,还解答了算法的有穷性的含义。 ... [详细]
  • PHP反射API的功能和用途详解
    本文详细介绍了PHP反射API的功能和用途,包括动态获取信息和调用对象方法的功能,以及自动加载插件、生成文档、扩充PHP语言等用途。通过反射API,可以获取类的元数据,创建类的实例,调用方法,传递参数,动态调用类的静态方法等。PHP反射API是一种内建的OOP技术扩展,通过使用Reflection、ReflectionClass和ReflectionMethod等类,可以帮助我们分析其他类、接口、方法、属性和扩展。 ... [详细]
  • 使用npmi编译vue项目出现无法下载github.com中的对应的包源文件报错信息如下:npmERR!fatal:unabletoaccess'https:github ... [详细]
  • C++程序员视角下的Rust语言
    自上世纪80年代初问世以来,C就是一门非常重要的系统级编程语言。到目前为止,仍然在很多注重性能、实时性、偏硬件等领域发挥着重要的作用。C和C一样&#x ... [详细]
author-avatar
qzq9037091
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有