在并行化中常用的一种技术是将嵌套的for循环合并,例如:
与使用正方形循环不同,这需要使用
我想知道是否有更简单或更有效的方法?例如,不需要
编辑:我不想要依赖于先前或下一个迭代的解决方案。我只想要像int
以下是一些代码展示它是如何工作的:
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
to
for(int x=0; x<n*n; x++) {
int i = x/n; int j = x%n;
我想知道如何将三角形循环合并成这样
for(int i=0; i<n; i++) {
for(int j=0; j<i+1; j++) {
这个程序有 n*(n+1)/2
次迭代。我们将合并后的迭代称为 x
。使用二次公式,我得出了以下结果:
for(int x=0; x<(n*(n+1)/2); x++) {
int i = (-1 + sqrt(1.0+8.0*x))/2;
int j = x - i*(i+1)/2;
与使用正方形循环不同,这需要使用
sqrt
函数和从整数到浮点数的转换以及从浮点数到整数的转换。我想知道是否有更简单或更有效的方法?例如,不需要
sqrt
函数或从整数到浮点数的转换或从浮点数到整数的转换。编辑:我不想要依赖于先前或下一个迭代的解决方案。我只想要像int
i = funci(x) and int j = funcj(x,i)
这样的解决方案。以下是一些代码展示它是如何工作的:
#include <stdio.h>
#include <math.h>
int main() {
int n = 5;
int cnt = 0;
for(int i=0; i<n; i++) {
for(int j=0; j<i+1; j++) {
printf("%d: %d %d\n", cnt++, i,j);
}
} printf("\n");
int nmax = n*(n+1)/2;
for(int x=0; x<nmax; x++) {
int i = (-1 + sqrt(1.0+8.0*x))/2;
int j = x - i*(i+1)/2;
printf("%d: %d %d\n", x,i,j);
}
}
sqrt()
看起来是一个非常不划算的交换。 - unwindsqrt
函数的情况下做到这一点吗? - Z bosonsqrt
不是唯一的昂贵函数,还包括与双精度浮点数之间的转换。 - MSalters