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