长数组相加如何优化?

bigbigknife 2008-11-20 01:28:12
加精
代码一:
for (int i=0; i<220000; i++)
{
dst[i] = src1[i] + src2[2];
}

代码二:
for (int i=0; i<220000; i++)
{
dst[i] += src[i];
}

这两段代码分别嵌在我的OpenMP并行循环代码中,代码二比代码一快将近10倍!
估计是2级Cache命中率的问题。试了MKL的vdAdd,不起作用。
有办法提高代码一的效率吗?
...全文
858 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
bigbigknife 2008-12-06
  • 打赏
  • 举报
回复
如果你使用VC2008编译x64程序,在项目属性>配置属性>C/C++>代码生成> 有个“启用增强指令集”选项,
它有三个选项:
(1)未设置;
(2)流式处理 SIMD 扩展(/arch:SSE);
(3)流式处理 SIMD 扩展 2 (/arch:SSE2)。
比如,我选(3),则编译的时候输出:
cl: 命令行 warning D9002 :忽略未知选项“/arch:SSE2”

用Intel C++ 10.1也有相应的选项,如果选上也是不起作用的。
我指的是这个选项。
QxT,QxP等是选择对应的CPU。当然是要选的。


[Quote=引用 27 楼 intel_iclifort 的回复:]
引用 25 楼 bigbigknife 的回复:
支持也是默认支持,编译器里的选项不支持。


如何生成, 请看置顶贴里的文章 "英特尔编译器中针对英特尔处理器优化的编译器选项" http://topic.csdn.net/u/20080402/15/2bd8d20e-c887-46a2-9afd-5fd5b75474aa.html

讲得非常详细了.


引用 25 楼 bigbigknife 的回复:
你如果硬要选,要不给你报错,要不告诉你忽略掉。


你用了什么选项, 报错信息贴出来看看吧
[/Quote]
bigbigknife 2008-12-06
  • 打赏
  • 举报
回复
如果你使用VC2008编译x64程序,在项目属性>配置属性>C/C++>代码生成> 有个“启用增强指令集”选项,
它有三个选项:
(1)未设置;
(2)流式处理 SIMD 扩展(/arch:SSE);
(3)流式处理 SIMD 扩展 2 (/arch:SSE2)。
比如,我选(3),则编译的时候输出:
cl: 命令行 warning D9002 :忽略未知选项“/arch:SSE2”

用Intel C++ 10.1也有相应的选项,如果选上也是不起作用的。
我指的是这个选项。
QxT,QxP等是选择对应的CPU。当然是要选的。


[Quote=引用 27 楼 intel_iclifort 的回复:]
引用 25 楼 bigbigknife 的回复:
支持也是默认支持,编译器里的选项不支持。


如何生成, 请看置顶贴里的文章 "英特尔编译器中针对英特尔处理器优化的编译器选项" http://topic.csdn.net/u/20080402/15/2bd8d20e-c887-46a2-9afd-5fd5b75474aa.html

讲得非常详细了.


引用 25 楼 bigbigknife 的回复:
你如果硬要选,要不给你报错,要不告诉你忽略掉。


你用了什么选项, 报错信息贴出来看看吧
[/Quote]
intel_iclifort 2008-12-06
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 bigbigknife 的回复:]
支持也是默认支持,编译器里的选项不支持
[/Quote]

如何生成, 请看置顶贴里的文章 "英特尔编译器中针对英特尔处理器优化的编译器选项" http://topic.csdn.net/u/20080402/15/2bd8d20e-c887-46a2-9afd-5fd5b75474aa.html

讲得非常详细了.


[Quote=引用 25 楼 bigbigknife 的回复:]
你如果硬要选,要不给你报错,要不告诉你忽略掉。
[/Quote]

你用了什么选项, 报错信息贴出来看看吧
bigbigknife 2008-12-06
  • 打赏
  • 举报
回复
这个简单的办法,俺早就试了。没用啊!

[Quote=引用 7 楼 iwillalwaysloveyou 的回复:]
memcpy(dst,src1,sizeof(dst[0]) * 220000);
for (int i=0; i <220000; i++)
{
dst[i] += src2[2];
}
[/Quote]
bigbigknife 2008-12-06
  • 打赏
  • 举报
回复
支持也是默认支持,编译器里的选项不支持。
你如果硬要选,要不给你报错,要不告诉你忽略掉。

[Quote=引用 6 楼 intel_iclifort 的回复:]
引用 5 楼 bigbigknife 的回复:
我用的是x64编程,SSE选项都不支持。


只要是支持Intel64技术(以前叫EM64T)的Intel处理器, 都支持SSE3指令
[/Quote]
zw19870621 2008-12-01
  • 打赏
  • 举报
回复
哦 这样啊
aero_boy 2008-11-30
  • 打赏
  • 举报
回复
你的数组是什么类型的啊, 如果是int什么的, 代码2不可能比代码1快多少
qq675927952 2008-11-30
  • 打赏
  • 举报
回复
up
itymx 2008-11-29
  • 打赏
  • 举报
回复
顶 顶 顶 顶 顶 顶 顶 顶 顶 建了个群 欢迎加入 群号:52993264
ph215405357 2008-11-27
  • 打赏
  • 举报
回复
jf
否认 2008-11-27
  • 打赏
  • 举报
回复
public class test
{
public String str(String str,int i)
{
String showstr="";

for(int j=1;j<str.length();j++)
{
int z=str.substring(0, j).getBytes().length;
if(z>=i)
{
return str.substring(0, j);
}
else
{
showstr+=str.substring(j-1, j);
}
}
return showstr;
}

public static void main(String args[])
{
String str="我是abc中国人";
int in=8;
test t=new test();
System.out.println(t.str(str,in));

}
}
yao_1978 2008-11-27
  • 打赏
  • 举报
回复

=================================




北京思源计算机培训中心(http://www.ciitc.com)
xiaosanaiqinga 2008-11-26
  • 打赏
  • 举报
回复
继续马克
yueyebohe 2008-11-26
  • 打赏
  • 举报
回复
mark,学习
derelictangel 2008-11-26
  • 打赏
  • 举报
回复
MARK


PS:
我的目标是 ---->

^_^
bubsy 2008-11-25
  • 打赏
  • 举报
回复
学习中!
NANCYBOY 2008-11-25
  • 打赏
  • 举报
回复
我 用 的 是 WIN32编码
aimeast 2008-11-25
  • 打赏
  • 举报
回复
学习
xiaopoy 2008-11-25
  • 打赏
  • 举报
回复
操作2个数组自然比操作3个数组快多了。
试试操作1个结构数组
for (int i = 0; i<220000; ++i)
{
array[i].dst += array[i].src;
}
QQBufferedReader 2008-11-25
  • 打赏
  • 举报
回复
有没有搞错,一个程序分这么段发?
加载更多回复(8)

568

社区成员

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

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