Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使clang矢量化一个简单的循环?

如何使clang矢量化一个简单的循环?
EN

Stack Overflow用户
提问于 2019-04-05 18:05:44
回答 2查看 4.1K关注 0票数 3

我有以下循环:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
float* s;
float* ap;
float* bp;

... // initialize s, ap, bp

for(size_t i=0;i<64;++i) {
   s[i] = ap[i]+bp[i];
}

似乎是向量化的好人选。尽管启动了优化,但当我查看程序集输出时,clang (我使用的是Xcode)似乎没有将循环向量化:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LBB33_1:                                ## =>This Inner Loop Header: Depth=1
    movss   (%rax,%rsi,4), %xmm0    ## xmm0 = mem[0],zero,zero,zero
    addss   (%rcx,%rsi,4), %xmm0
    movss   %xmm0, (%rdx,%rsi,4)
Ltmp353:
    incq    %rsi
Ltmp354:
    cmpq    $64, %rsi
Ltmp355:
    jne LBB33_1

如何获得clang/Xcode来矢量化这个简单的循环?

EN

回答 2

Stack Overflow用户

发布于 2019-04-05 18:32:13

使用非古代版本的clang/LLVM。Apple /LLVM与主线clang/LLVM不同,但它们有一个共同的代码库。

主线clang3.3和更新的自动矢量化循环在-O3.-O2**.** Clang3.4和更新版本的自动矢量化

如果没有restrict,clang就会发出asm,以检查目标和两个源之间的重叠(返回到标量),因此您将从float *restrict s获得更有效的asm。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdlib.h>
void add_float_good(float *restrict s, float *restrict ap, float *restrict bp)
{
    for(size_t i=0;i<64;++i) {
       s[i] = ap[i]+bp[i];
    }
}

用最糟糕的索引寻址模式和循环开销将使用clang3.4-O3(在戈德波特编译器浏览器上)编译到这个简单的asm中,但至少它是向量化的。较新的clang喜欢展开,特别是在为最近的英特尔(如-march=skylake)进行调优时。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# clang3.4 -O3
add_float_good:
        xor     eax, eax
.LBB0_1:                                # %vector.body
        movups  xmm0, xmmword ptr [rsi + 4*rax]
        movups  xmm1, xmmword ptr [rdx + 4*rax]
        addps   xmm1, xmm0
        movups  xmmword ptr [rdi + 4*rax], xmm1
        add     rax, 4
        cmp     rax, 64
        jne     .LBB0_1
        ret

注意,如果没有AVX,它就不能为addps使用内存源操作数,因为没有编译时对齐的保证。

clang8.0 -O3 -march=skylake完全使用YMM向量展开,就像gcc具有相同的选项。

票数 12
EN

Stack Overflow用户

发布于 2019-04-05 18:13:35

最好是使用“加速”来明确这一点。在这种情况下,vDSP_vadd会做到这一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55545231

复制
相关文章
如何加速一个简单的for循环?
那么加速的其中一个关键就是减少循环次数,因为每次循环结束之后本质上都是一个分支指令的判断,判断这次循环是否结束。如果是则跳出循环,进行下一个代码块的执行,否则继续循环。
老肥码码码
2020/03/12
1.4K0
clang -O3 for循环的LLVM IR
这里删去了用处不大的内容,只保留了关键的LLVM IR。通过分析可以看到,如果循环小于8 LLVM IR会使用vector,vector使用SIMD指令高效进行计算,如果大于8则是普通的for形式。
racaljk
2018/08/31
1.3K0
python中使用矢量化替换循环
所有编程语言都离不开循环。因此,默认情况下,只要有重复操作,我们就会开始执行循环。但是当我们处理大量迭代(数百万/十亿行)时,使用循环是一种犯罪。您可能会被困几个小时,后来才意识到它行不通。这就是在 python 中实现矢量化变得非常关键的地方。
程序那些事儿
2023/03/07
1.7K0
python中使用矢量化替换循环
[062][译]Auto-Vectorization in LLVM
最近遇到一个性能问题,与Auto-Vectorization in LLVM有关,翻译一下官方介绍 http://llvm.org/docs/Vectorizers.html
王小二
2020/12/14
3.3K0
[062][译]Auto-Vectorization in LLVM
python for循环if-else使
a = [i*2 for i in mylist]; print(a) #[-2, 0, 2, 4, 6, 8]
py3study
2020/01/13
6060
ElasticSearch(7.2.2)-搜索的简单使⽤
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
cwl_java
2019/10/30
4060
clang 源码导读(1): clang 入门
本系列文章会通过对 clang 源码进行拆解的方式,逐步对 clang 内部的各种逻辑进行介绍。
酷酷的哀殿
2021/03/18
5.2K0
clang 源码导读(1): clang 入门
MongoDB 如何使定制电子商务变得简单
开源电子商务软件市场已经历了众多发展阶段,您可能已经通过 osCommerce、Magento、Zen Cart、PrestaShop、Spree 等流行平台而有所了解。这些平台经常用作定制电子商务软件的基础,都要求使用一个 SQL 数据库。由于开源软件在适应定制功能时存在固有的挑战,现在看来 MongoDB 将在电子商务的下一轮发展进化中扮演着重要角色。 Kyle Banker 是 2010 年 4 月第一批就 MongoDB 和电子商务 发表博客的人,自那以后就令人意外地很少出来此类文章。在博客中,Ky
张善友
2018/01/29
1.4K0
python学习-paramiko简单使
    paramiko是基于python实现的ssh2远程安全连接,支持认证及密钥方式。可以实现远程命令执行,文件传输、中间ssh代理等功能。
py3study
2020/01/06
5560
使你的 JavaScript 代码简单易读[每日前端夜话0x4C]
解决一个问题可以有很多方法,但是有些方法很复杂,甚至有些是荒谬的。在本文中,我想谈谈解决一个问题时的好方案和坏方案。
疯狂的技术宅
2019/04/23
6140
Clang - Use Xcode to make first Clang plugin
How to build clang~ Firstly, you need download and install CMake, a article about how to study CMake for new leaner. Secondly, make directory and download the LLVM source code: //make directory cd /opt sudo mkdir llvm sudo chown `whoami` llvm cd llvm
Mitchell
2018/09/30
1.5K0
Clang - Use Xcode to make first Clang plugin
clang 源码导读(2): clang driver 流程简介
Pipeline: Compilation Action Construction:根据每个输入的文件和类型,组建 action(比如 PreprocessJobAction)
酷酷的哀殿
2021/03/18
2.3K0
clang 源码导读(2): clang driver 流程简介
C#如何:编写简单的 Parallel.ForEach 循环
本文档使用 lambda 表达式在 PLINQ 中定义委托。 如果不熟悉 C# 或 Visual Basic 中的 lambda 表达式,请参阅 PLINQ 和 TPL 中的 Lambda 表达式。
全栈程序员站长
2022/09/09
1.6K0
clang 源码导读(3): clang driver 参数解析
为了控制 clang 的运行,clang 必须支持不同的参数对各种行为进行控制,所以,clang driver 启动后的第一个主要任务就是 参数解析
酷酷的哀殿
2021/03/18
2.1K0
clang 源码导读(3): clang driver 参数解析
如何实现一个简单的IOC
在之前的文章中,楼主和大家一起分析spring的 IOC 实现,剖析了Spring的源码,看的出来,源码异常复杂,这是因为Spring的设计者需要考虑到框架的扩展性,健壮性,性能等元素,因此设计的很复杂。楼主在最后也说要实现一个简单的 IOC,让我们更加深刻的理解IOC,因此,有了这篇文章。
Bug开发工程师
2018/09/21
6870
Go+简单for循环
    如果我们想循环执行某个操作,这个时候就需要循环控制结构,也就是for循环。for循环的意思是根据循环的判断条件,当条件为真的时候,执行某种操作,直到循环为假的时候才跳出这个循环。
上分如喝水
2021/12/12
3140
clang 源码导读(4): clang driver 构建 Actions
本篇文章会对 clang driver 的 构建 Actions 流程进行详细的讲解
酷酷的哀殿
2021/03/18
2.3K1
clang 源码导读(4): clang driver 构建 Actions
如何使 Grafana as code
Grafana Dashboard 可以做很多事情,但您知道其实是可以通过代码来配置管理 Grafana Dashboard 的吗?本文是 Grafana Labs 软件开发工程师 Malcolm Holmes 和 Inuits 的开源顾问 Julien Pivotto 在 FOSDEM 2020 上的 topic 演讲记录。演讲中,两人讨论了如何使用代码来管理您的 Grafana 实例,并介绍了一些使用 Jsonnet[1] 的秘诀和技巧以及 Grafonnet[2](一个用于生成 Grafana Dashboard 的 Jsonnet 库)。
郭旭东
2020/12/30
1.7K0
如何使 Grafana as code
如何实现一个简单的-IOC
我们还记得Spring中最重要的有哪些组件吗?BeanFactory 容器,BeanDefinitionBean的基本数据结构,当然还需要加载Bean的资源加载器。
三哥
2018/09/20
7880
如何实现一个简单的-IOC
点击加载更多

相似问题

如何使clang/gcc向矢量化环数组比较?

26

如何使clang警告非常简单的狭窄

13

简单循环: gcc的矢量化

14

如何使一个简单的循环更通用

11

如何在clang++中禁用矢量化?

133
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文