首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >fortran环的simd向量长度和展开因子

fortran环的simd向量长度和展开因子
EN

Stack Overflow用户
提问于 2015-08-18 00:53:34
回答 1查看 794关注 0票数 4

我想用SIMD指令将下面的fortran矢量化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!DIR$ SIMD
    DO IELEM = 1 , NELEM
      X(IKLE(IELEM)) = X(IKLE(IELEM)) + W(IELEM)
    ENDDO

我使用了avx2指令。这个程序是由

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ifort main_vec.f -simd -g -pg -O2 -vec-report6 -o vec.out -xcore-avx2 -align array32byte

那么我想在VECTORLENGTH(n)之后添加SIMD子句。如果没有这样的子句或n= 2,4,则信息不会提供有关展开因子的信息。

如果n= 8,16,vectorization support: unroll factor set to 2

我读过英特尔关于矢量化支持:展开因子设置为xxxx的文章,所以我想循环是展开成这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    DO IELEM = 1 , NELEM, 2
      X(IKLE(IELEM)) = X(IKLE(IELEM)) + W(IELEM)
      X(IKLE(IELEM+1)) = X(IKLE(IELEM+1)) + W(IELEM+1)
    ENDDO

然后2X进入向量寄存器,2W转到另一个,做加法。但是VECTORLENGTH的价值是如何工作的呢?或者我不太明白向量长度是什么意思。

由于我使用avx2指令,对于DOUBLE PRECISION类型的X,可以达到的最大长度是多少?

下面是包含SSE2、VL=8和编译器的循环汇编的一部分,它告诉我展开因子是2,但是它使用了4个寄存器而不是2个寄存器。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.loc    1  114  is_stmt 1
        movslq    main_vec_$IKLE.0.1(,%rdx,4), %rsi             #114.9
..LN202:
        movslq    4+main_vec_$IKLE.0.1(,%rdx,4), %rdi           #114.9
..LN203:
        movslq    8+main_vec_$IKLE.0.1(,%rdx,4), %r8            #114.9
..LN204:
        movslq    12+main_vec_$IKLE.0.1(,%rdx,4), %r9           #114.9
..LN205:
        movsd     -8+main_vec_$X.0.1(,%rsi,8), %xmm0            #114.26
..LN206:
        movslq    16+main_vec_$IKLE.0.1(,%rdx,4), %r10          #114.9
..LN207:
        movhpd    -8+main_vec_$X.0.1(,%rdi,8), %xmm0            #114.26
..LN208:
        movslq    20+main_vec_$IKLE.0.1(,%rdx,4), %r11          #114.9
..LN209:
        movsd     -8+main_vec_$X.0.1(,%r8,8), %xmm1             #114.26
..LN210:
        movslq    24+main_vec_$IKLE.0.1(,%rdx,4), %r14          #114.9
..LN211:
        addpd     main_vec_$W.0.1(,%rdx,8), %xmm0               #114.9
..LN212:
        movhpd    -8+main_vec_$X.0.1(,%r9,8), %xmm1             #114.26
..LN213:
..LN214:
        movslq    28+main_vec_$IKLE.0.1(,%rdx,4), %r15          #114.9
..LN215:
        movsd     -8+main_vec_$X.0.1(,%r10,8), %xmm2            #114.26
..LN216:
        addpd     16+main_vec_$W.0.1(,%rdx,8), %xmm1            #114.9
..LN217:
        movhpd    -8+main_vec_$X.0.1(,%r11,8), %xmm2            #114.26
..LN218:
..LN219:
        movsd     -8+main_vec_$X.0.1(,%r14,8), %xmm3            #114.26
..LN220:
        addpd     32+main_vec_$W.0.1(,%rdx,8), %xmm2            #114.9
..LN221:
        movhpd    -8+main_vec_$X.0.1(,%r15,8), %xmm3            #114.26
..LN222:
..LN223:
        addpd     48+main_vec_$W.0.1(,%rdx,8), %xmm3            #114.9
..LN224:
        movsd     %xmm0, -8+main_vec_$X.0.1(,%rsi,8)            #114.9
..LN225:
   .loc    1  113  is_stmt 1
        addq      $8, %rdx                                      #113.7
..LN226:
   .loc    1  114  is_stmt 1
        psrldq    $8, %xmm0                                     #114.9
..LN227:
   .loc    1  113  is_stmt 1
        cmpq      $26000, %rdx                                  #113.7
..LN228:
   .loc    1  114  is_stmt 1
        movsd     %xmm0, -8+main_vec_$X.0.1(,%rdi,8)            #114.9
..LN229:
        movsd     %xmm1, -8+main_vec_$X.0.1(,%r8,8)             #114.9
..LN230:
        psrldq    $8, %xmm1                                     #114.9
..LN231:
        movsd     %xmm1, -8+main_vec_$X.0.1(,%r9,8)             #114.9
..LN232:
        movsd     %xmm2, -8+main_vec_$X.0.1(,%r10,8)            #114.9
..LN233:
        psrldq    $8, %xmm2                                     #114.9
..LN234:
        movsd     %xmm2, -8+main_vec_$X.0.1(,%r11,8)            #114.9
..LN235:
        movsd     %xmm3, -8+main_vec_$X.0.1(,%r14,8)            #114.9
..LN236:
        psrldq    $8, %xmm3                                     #114.9
..LN237:
        movsd     %xmm3, -8+main_vec_$X.0.1(,%r15,8)            #114.9
..LN238:
EN

回答 1

Stack Overflow用户

发布于 2015-08-19 01:18:02

1) 向量长度N是在循环“向量化”后可以并行执行的许多元素/迭代(通常通过将X阵列的N个元素放入单个向量寄存器并通过向量指令进行处理)。为了简化,可以把向量长度看作这个公式给出的值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Vector Length (abbreviated VL) = Vector Register Width / Sizeof (data type)

对于AVX2,矢量寄存器宽度= 256位。Sizeof (双精度)=8字节= 64位。因此:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Vector Length (double FP, avx2) = 256 / 64 = 4

$DIR SIMD VECTORLENGTH (N)基本上强制编译器使用指定的向量长度(并将X数组的N个元素放入单矢量寄存器)。就这样。

2) 展开与矢量化关系。为了简化,可以将展开和矢量化看作是通常的无关(有点“正交”)优化技术。

如果您的循环按M的因子展开(M可以是2,4,..),那么它不一定意味着使用了向量寄存器,而不是表示循环在任何意义上都是并行的。相反,它的意思是原始循环迭代的M个实例被分组为单个迭代;在给定的新的“unwinded”/“未滚动”迭代中,旧的前迭代是依次执行的(所以您的猜测是绝对正确的)。

展开的目的通常是使循环更加“微体系结构/内存友好”。更多细节:通过使循环迭代更“胖”,通常可以改善CPU资源压力与内存/缓存资源压力之间的平衡,特别是在展开之后,您通常可以更有效地重用寄存器中的一些数据。

3) 展开+矢量化。编译器同时(用VL=N)和展开(通过M)对某些循环进行矢量化,这并不少见。因此,按照NxM的近似因子,优化循环中的迭代次数小于原始循环中的迭代次数,但是并行处理的元素数(在给定的时刻同时处理)仅为N。因此,在您的示例中,如果循环用VL=4向量化,并由2展开,则其伪代码可能如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DO IELEM = 1 , NELEM, 8
  [X(IKLE(IELEM)),X(IKLE(IELEM+2)), X(IKLE(IELEM+4)), X(IKLE(IELEM+6))] = ...
  [X(IKLE(IELEM+1)),X(IKLE(IELEM+3)), X(IKLE(IELEM+5)), X(IKLE(IELEM+7))] = ...
ENDDO

,其中方括号“对应”矢量寄存器内容。

4) 矢量化反对展开

  • 对于迭代次数相对较少的循环(特别是在C++中)--展开可能是不可取的,因为它部分阻止了高效的矢量化(没有足够的迭代并行执行),而且(正如您从我的人工示例中看到的)可能会以某种方式影响必须从内存加载数据的方式。不同的编译器有不同的启发式wrt平衡行程计数,VL和彼此之间的展开;这可能就是为什么在VL小于8的情况下禁用了展开。
  • 运行时和编译时在行程计数、展开和向量长度之间的权衡以及批准的自动建议(特别是在使用新的Intel C++或Fortran编译器的情况下)可以使用"Intel (矢量化)顾问":

有第三个维度(我不太喜欢谈论它)。

当用户请求的向量长度大于给定硬件上的向量长度(假设为双FP为avx2平台指定向量长度(16))或混合不同类型时,则编译器可以(或不能)开始使用“虚拟向量寄存器”的概念并开始执行double-/quad-pumping.M-抽水是一种展开,但只适用于单指令(即抽水导致重复单指令,而展开则导致整个回路体重复)。你可以试着在最近的OpenMP书中读到关于m-抽吸的东西,比如given 。因此,在某些情况下,您可能会以( a)向量化、( b)展开和( c)双泵浦的叠加结束,但这不是常见的情况,我将避免执行向量长度> 2*ISA_VectorLength。

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

https://stackoverflow.com/questions/32067818

复制
相关文章
flex vue 垂直居中居上_flex 垂直居中、两列对齐、自适应宽[通俗易懂]
hahjdjjajdES6提供的Proxy可以让JS开发者很方便的使用代理模式,听说Vue
全栈程序员站长
2022/08/23
1.1K0
bootstrap 模态框垂直居中实现方法 原
(adsbygoogle = window.adsbygoogle || []).push({});
tianyawhl
2019/04/04
1.2K0
div垂直居中的几种方式_div垂直水平居中
利用CSS进行元素的水平居中,比较简单,行级元素设置其父元素的text-align center,块级元素设置其本身的left 和 right margins为auto即可。本文收集了六种利用css进行元素的垂直居中的方法,每一种适用于不同的情况,在实际的使用过程中选择某一种方法即可。
全栈程序员站长
2022/08/03
4.1K0
div垂直居中的几种方式_div垂直水平居中
HTML 水平居中 垂直居中 垂直水平居中的几种实现方式「建议收藏」
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说HTML 水平居中 垂直居中 垂直水平居中的几种实现方式「建议收藏」,希望能够帮助大家进步!!!
Java架构师必看
2022/05/22
5.3K0
HTML 水平居中 垂直居中 垂直水平居中的几种实现方式「建议收藏」
Android 浏览器文本垂直居中问题
在开发中,我们常使用 line-height 属性来实现文本的垂直居中,但是在安卓浏览器渲染中有一个常见的问题,就是对于小于12px的字体使用 line-height 属性进行垂直居中的时候,渲染出来的效果并不是文字垂直居中,而是会偏上一些。举两个代码示例如下:
IMWeb前端团队
2019/12/04
9760
不确定行数的多行文本垂直水平居中的css
ul li { position:relative; display: table; width:3rem; height:3rem; background:url('image/defaultBg.jpg') 0 0/100% 100% no-repeat; float:left; margin-bottom:0.2rem; text-al
蓓蕾心晴
2018/04/12
1.4K0
VB的TextBox文本框实现垂直居中显示的方法
Form_Load()窗体代码中的多行属性设置必须为真,即Text1.MultiLine = True,该属性为只读属性,请在设计时修改,换行会被之后的代码屏蔽,不想屏蔽可自行修改,调用此函数就好了。
大师级码师
2022/11/06
2.9K0
Android 浏览器文本垂直居中问题
本文介绍了在Android浏览器上实现文本垂直居中的问题,并提供了两个解决方案:改变字体大小和用表格布局。通过测试,发现改变字体大小的方法并没有达到真正的垂直居中,而使用表格布局的方法则可以较好地实现文本垂直居中。
IMWeb前端团队
2017/12/29
1.7K0
Android 浏览器文本垂直居中问题
【前端攻略】最全面的水平垂直居中方案与flexbox布局
最近又遇到许多垂直居中的问题,这是Css布局当中十分常见的一个问题,诸如定长定宽或不定长宽的各类容器的垂直居中,其实都有很多种解决方案。而且在Css3的flexbox出现之后,解决各类居中问题变得更加容易了。搜了搜园子内关于flexbox的文章觉得很多不够详尽,故想借介绍flexbox的同时好好总结一番各类垂直居中的方法。由简至繁: 行内元素的水平居中     要实现行内元素(<span>、<a>等)的水平居中,只需把行内元素包裹在块级父层元素(<div>、<li>、<p>等)中,并且在父层元素CSS设置如
Sb_Coco
2018/05/28
1.4K0
元素垂直居中和水平居中的方法
前言 元素居中一直是css布局中常见的问题 正文 水平居中 内联元素 只需把内联元素包裹在块状父元素中,并在父元素css上设置:text-align:center; 此方法适用于文字、链接 块级元素 宽度一定的块级元素:只需设置左右外边距为auto,即:margin:0 auto; 多个块级元素 将要水平排列的块级元素设置display:inline-block;然后在父元素上设置text-align:center; 效果和内联元素水平居中一样 Flex布局 在父元素上设置:display:flex;jus
pitaojin
2018/05/24
1.8K0
元素的垂直居中的方法
单行文本的垂直居中 只需让元素的行高的值设置成和高度的值一样即可。如 height: 30px; line-height: 30px; 高度不固定的元素的垂直居中 使用 Flex 父元素加 display: flex; align-items: center; 然后就搞定了,很简单吧。 使用 table 布局 父元素加 display: table; /*让元素以表格形式渲染*/ height: 200px; /* 需要定宽,定高 */ width: 100px; 子元素加 display: table-
前端GoGoGo
2018/08/27
4760
css垂直居中怎么设置?文字上下居中和图片垂直居中
  css 居中分css垂直居中和css水平居中,水平居中平时比较常用,这里我们主要讲css上下居中的问题。垂直居中又分为css文字上下居中和css图片垂直居中,下面我们就分别来介绍一下。 css文字上下居中:一、单行内容的居中。只考虑单行是最简单的,无论是否给容器固定高度,只要给容器设置 line-height 和 height,并使两值相等,再加上 over-flow: hidden 就可以了。css代码为{height: 4em;line-height: 4em;overflow: hidden;}
ytkah
2018/03/06
7.6K0
水平居中和垂直居中
本章介绍几种常见的水平居中和垂直居中的实现方式 <!DOCTYPE html> <html> <head> <title>水平居中和垂直居中</title> <meta charset="utf-8"> </head> <style type="text/css"> .box { /* 在一个基础的盒子里面显示效果 */ position: relative; float: left; width: 250px; h
echobingo
2018/04/25
2.7K0
水平居中和垂直居中
垂直方向上下居中_如何实现垂直居中
这是最简单的方法,不仅能实现绝对居中同样的效果,也支持联合可变高度方式使用。内容块定义transform: translate(-50%,-50%) 必须加上
全栈程序员站长
2022/09/19
1.7K0
垂直水平居中
2.绝对定位计算:对子元素使用绝对定位,并分别移动上左50%,再分别margin-top:-50%height px,margin-left:-50%width px;
菜的黑人牙膏
2019/01/21
1.6K0
Css 垂直居中
在 CSS 中对元素进行水平居中是非常简单的:如果它是一个行内元素, 就对它的父元素应用 text-align:center; 如果它是一个块级元素,就对它自身应用 margin:auto。然而如果要对一个元素进行垂直居中,可能光是想想就令人头皮发麻了。
grain先森
2019/03/29
2.8K0
Css 垂直居中
css的div垂直居中的方法,百分比div垂直居中
我们都知道,固定高宽的div在网页中垂直居中很简单,相信大家也很容易的写出来,但是不是固定高宽的div如何垂直居中呢?我们在网页布局,特别是手机等web端网页经常是不固定高宽的div,那么这些div如何垂直居中呢?这篇文章,我总结一下。
Dawnzhang
2019/02/27
2.7K0
内容垂直居中
测试内容测试内容测试内容测试内容测试内容测试内容测试内容测试内容测试内容测试内容测试内容测试内容测试内容测试内容测试内容测试内容测试内容
GhostZhang
2022/08/21
9950
CSS垂直居中
方案1 关键代码 父类: display: table-cell; vertical-align: middle; 示例: <style> .parent { width: 200px; height: 600px; background-color: blueviolet; display: table-cell; vertical-align: middle;
乐心湖
2020/07/31
3.4K0
垂直居中 原
垂直居中的方法很多,一般是设置line-height,display:table-cell,vertical-align:middle,或者transform:translate(0,-50%),最近看到也可以使用另一种方法实现垂直居中
tianyawhl
2019/04/04
9260

相似问题

开发Eclipse插件时的图形用户界面

136

当Eclipse索引器卡住时,我该怎么办?

411

当Conda找不到Python包时该怎么办?

136

当"which“函数找不到值时该怎么办?

10

图形用户界面+线程,图形用户界面退出线程停留->当图形用户界面再次启动时如何检测线程?

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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