弱问,我使用"向量化"选项怎么没有效果?

hudc04 2010-01-15 09:17:05
我使用的是VS 2005 + intel C++ 11.0, 计算的是水动力学模型.

我机器的 CPU: Q9550, 设置了:
C/C++ -> Code Generation -> Intel Processor-specific Opitimization -> QxSSE4.1
怎么没效果?设置其他的选项也没效果.


是否 " 只要使用intel C++, 即使在缺省的配置下程序已经被向量化了?"
还是要象Openmp那样,需要在程序中添加额外的语句,例如 #pragma ivdep
...全文
271 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
suanyuan 2010-01-20
  • 打赏
  • 举报
回复
來亂的,看不懂你們在討論什麼。
nieniekameal 2010-01-19
  • 打赏
  • 举报
回复
学到东西了
bcl258586301 2010-01-19
  • 打赏
  • 举报
回复
不懂,路过还是要拿分的..
yepingapple 2010-01-19
  • 打赏
  • 举报
回复
不太懂!
sffntml3 2010-01-19
  • 打赏
  • 举报
回复
学习.....
lsgwoody 2010-01-19
  • 打赏
  • 举报
回复
hfrll 2010-01-19
  • 打赏
  • 举报
回复
拿分……
zhenli0313 2010-01-18
  • 打赏
  • 举报
回复
楼主,不好意思,我是来留言的,换积分的,手下留情啊!
intel_iclifort 2010-01-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hudc04 的回复:]
我的机器是Q9550, 向量化优化选项从None换成QxSSE2或QxSSE4.1时,计算速度都没变化.
[/Quote]

一则是SSE3, SSE4.1中新增加的指令集, 是否对你的代码性能优化有帮助.

还有就是, 编译器还没有能够发现利用SSE3, SSE4.1指令进行优化的可能性


[Quote=引用 7 楼 hudc04 的回复:]
就是你说的在缺省情况下,我已经使用了向量化了吧?
[/Quote]
是的, 如果用的版本是11.0及以后, 编译器缺省就会打开自动向量化, 针对SSE2指令

[Quote=引用 7 楼 hudc04 的回复:]
我想:在缺省情况下向量化的使用,也是intel C++明显比MS VC快很多的原因,是这样吗?
[/Quote]
向量化只是很多优化工作中, 最有效的一种而已. 其它还包括Inline, 循环转置, 展开, 等等

在Intel编译器的随机安装的手册中, 详细介绍了很多种优化方法, 感兴趣的可以看看, 或许有帮助
BXYT1988 2010-01-18
  • 打赏
  • 举报
回复
学习.....
ifrancis 2010-01-18
  • 打赏
  • 举报
回复
gggl
hudc04 2010-01-17
  • 打赏
  • 举报
回复
我的机器是Q9550, 向量化优化选项从None换成QxSSE2或QxSSE4.1时,计算速度都没变化.
就是你说的在缺省情况下,我已经使用了向量化了吧?
我想:在缺省情况下向量化的使用,也是intel C++明显比MS VC快很多的原因,是这样吗?

[Quote=引用 1 楼 intel_iclifort 的回复:]
1. 从11.0版本以后, -QxSSE2(-QxW)才是缺省的选项, 或者说 缺省打开向量化优化.  以前的版本必须手动添加

2. 代码能不能被自动向量化, 取决于很多因素, 比如说循环前后是否有依赖关系, 指针数组是否有二义性等等

3. 可以通过选项 -Qvec-report3  获得向量化优化报告, 来得到自动向量化成功或者失败的说明

4. 可以在程序代码中添加额外的语句,例如 #pragma ivdep, 告示编译器指针没有二义性, 但仍然有无法被自动向量化的可能, 也可以通过向量化报告来得到原因


[/Quote]
seriuscoolboy 2010-01-16
  • 打赏
  • 举报
回复
hudc04 2010-01-15
  • 打赏
  • 举报
回复
刚才照你说的方法试了一下,遇到如下情况loop was not vectorized
情况1:(循环里包含判断的情况)
for(i=0;i<m_np;i++)
{
if(it!=iths && dwp[i]==0 && dwp_new[i]!=0)
{
uu2[i]=0; vv2[i]=0;
}
}
情况2:类似与 aa[M*N]格式的数组
for(ksed=0;ksed<NFS;ksed++)SLDel[i*NFS+ksed]=0;

intel_iclifort 2010-01-15
  • 打赏
  • 举报
回复
1. 从11.0版本以后, -QxSSE2(-QxW)才是缺省的选项, 或者说 缺省打开向量化优化. 以前的版本必须手动添加

2. 代码能不能被自动向量化, 取决于很多因素, 比如说循环前后是否有依赖关系, 指针数组是否有二义性等等

3. 可以通过选项 -Qvec-report3 获得向量化优化报告, 来得到自动向量化成功或者失败的说明

4. 可以在程序代码中添加额外的语句,例如 #pragma ivdep, 告示编译器指针没有二义性, 但仍然有无法被自动向量化的可能, 也可以通过向量化报告来得到原因

intel_iclifort 2010-01-15
  • 打赏
  • 举报
回复
OpenMP的实现上有线程池(thread pool)的概念, 就是为了解决线程反复创建和销毁带来的开销, 一般是自动完成的.

OpenMP还可以通过设置环境变量 OMP_NUM_THREADS=n, 或者在程序内部控制, 来设定线程的总数. 一般缺省=core的总数, 不建议设置超过
hudc04 2010-01-15
  • 打赏
  • 举报
回复
另外,请教一个问题,
OpenMP能否设置固定线程,不采用动态创建和销毁的模式?

我想这样可以节约时间开销了.
intel_jeff 2010-01-15
  • 打赏
  • 举报
回复
第1个例子,循环体中包含了较复杂的if语句,因此会造成向量化代码效率低下或不能向量化。
第2个例子,可能由于NFS太小等原因而没做向量化
建议加上 /Qvec-report3 看下失败原因。关于该开关的介绍,请看 http://www.intel.com/software/products/compilers/flin/docs/main_for/mergedprojects/copts_for/common_options/option_vec_report.htm

567

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧