通过在循环内部或外部进行操作来加速程序

时间:2012-12-18 18:24:45

标签: performance optimization loops fortran bigdata

我刚才有一个关于fortran优化的问题(可能是一般的程序):

有两种方法可以在整个矢量上或逐行地执行基本操作,即

x = array(:,1)
y = array(:,2)
z = array(:,3)

x1 = floor(x/k) + 1
y1 = floor(y/k) + 1
z1 = floor(z/k) + 1

OR

do i = 1:n
   x1(i) = floor(x(i)/k) + 1
   y1(i) = floor(y(i)/k) + 1
   z1(i) = floor(z(i)/k) + 1
end do

我可以在循环中执行openmp,因为有1亿条目,但我不确定它是否会发生。在循环中或循环外执行它会更快吗?经验和常识告诉我在外面做。该程序还有其他组件,但我发现大部分时间都是通过创建新的向量x1,y1,z1来实现的,因为要转换的x,y,z值很多。

1 个答案:

答案 0 :(得分:0)

这将是内存带宽限制。如果它们在内存中是分开的(即不是一些奇怪的非连续指针),我会采用第一种方式。但最好是尝试和测量,没有探查器可能很容易出错。此外,您也可以为第一个版本执行OpenMP或自动并行化。