循环嵌套中的精确依赖分析_第1页
循环嵌套中的精确依赖分析_第2页
循环嵌套中的精确依赖分析_第3页
循环嵌套中的精确依赖分析_第4页
循环嵌套中的精确依赖分析_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

19/25循环嵌套中的精确依赖分析第一部分循环嵌套中的依赖分析概述 2第二部分指令级并行的挑战和局限性 4第三部分依赖距离和循环迭代之间的关系 6第四部分GCD测试和循环不变式识别 9第五部分精确依赖分析的算法和技术 11第六部分循环嵌套中的循环展开和切片 14第七部分依赖分析在编译器优化中的应用 17第八部分提高循环嵌套分析精度的方法 19

第一部分循环嵌套中的依赖分析概述循环嵌套中的依赖分析概述

循环嵌套中的依赖分析是编译器优化中至关重要的一步,它确定循环迭代之间的依赖关系,从而指导优化器做出明智的决策。

#依赖类型的分类

依赖关系可以分为以下类型:

*真依赖(Flowdependence):当一个语句读取另一个语句写入的内存位置时,存在真依赖。

*反依赖(Anti-dependence):当一个语句写入另一个语句读取的内存位置时,存在反依赖。

*输出依赖(Outputdependence):当不同迭代的两个语句写入同一个内存位置时,存在输出依赖。

#依赖分析技术

已开发了多种依赖分析技术,包括:

*迭代区间分析(Iterationdomainanalysis):通过跟踪变量在循环嵌套中的取值范围,识别循环迭代之间的依赖关系。

*基于符号表的分析:使用编译器的前端来识别循环嵌套中变量的引用和定义,从而推断依赖关系。

*依赖图:构建一个有向图来表示循环嵌套中语句之间的依赖关系,其中节点表示语句,边表示依赖关系。

#依赖分析的重要性

依赖分析对于各种编译器优化至关重要,包括:

*循环展开:将循环展开为一组不包含循环的语句,从而提高局部性。

*循环平铺:将循环展开并分组为块,以便并行执行。

*循环融合:将多个循环合并为单个循环,从而减少开销。

*循环交换:重新排列循环嵌套的顺序,以改善数据局部性或并行性。

*循环消除:确定并消除不必要的循环,例如恒定循环或恒为假的条件循环。

循环嵌套中的依赖分析优势

进行循环嵌套中的依赖分析具有以下优势:

*提高优化效率:依赖分析提供了循环迭代之间依赖关系的精确信息,这可以指导优化器做出更好的优化决策,从而提高优化效率。

*提高并行性:通过识别循环迭代之间的独立性,依赖分析可以帮助优化器发现并行机会,从而提高程序的并行性能。

*减少内存开销:通过识别循环迭代之间的依赖关系,依赖分析可以帮助优化器减少不必要的内存访问和存储,从而降低内存开销。

*提高代码质量:依赖分析可以帮助识别并消除循环嵌套中的错误或不必要的依赖关系,从而提高代码质量。

循环嵌套中的依赖分析挑战

进行循环嵌套中的依赖分析也面临一些挑战:

*保守性:由于无法确定循环迭代的确切运行顺序,依赖分析可能过于保守,从而报告更多依赖关系,限制优化机会。

*复杂性:循环嵌套的依赖分析可能非常复杂,特别是对于嵌套较深的循环嵌套,并且可能会耗费大量时间和计算资源。

*精度:依赖分析的精度取决于循环嵌套中变量的符号信息,如果符号信息不准确,依赖分析结果也可能不准确。

结论

循环嵌套中的依赖分析是编译器优化中的一项基本技术。通过识别循环迭代之间不同类型的依赖关系,依赖分析可以帮助优化器做出明智的决策,提高优化效率、并行性、内存开销和代码质量。尽管存在一些挑战,但依赖分析仍然是编译器优化中至关重要且有价值的步骤。第二部分指令级并行的挑战和局限性指令级并行的挑战和局限性

指令级并行(ILP)通过在单个处理器内核中并行执行多个指令来提高性能。它旨在通过更有效地利用处理器资源,例如执行单元、寄存器文件和指令缓存,来减少程序的执行时间。然而,ILP面临着以下挑战和局限性:

依赖关系限制

指令级并行最大的障碍是指令之间的依赖关系。当一条指令的结果被后续指令使用时,就会产生依赖关系。例如,如果指令A将值存储在寄存器中,而指令B随后从该寄存器中读取值,则指令B依赖于指令A。这些依赖关系限制了指令可以并行执行的程度。

复杂的分支预测

指令级并行需要准确预测分支指令的执行路径,以便提前获取依赖指令。分支预测器用于预测分支指令的执行路径,但它们的准确性受到限制。不准确的分支预测会导致执行错误,从而降低程序性能。

资源冲突

当多个指令同时需要访问相同的处理器资源(例如执行单元、寄存器文件或指令缓存)时,就会发生资源冲突。这些冲突限制了可以并行执行的指令数量,因为处理器必须在竞争性指令之间仲裁。

编译器复杂性

为了实现有效指令级并行,编译器必须识别程序中的并行机会并生成适当的代码。这通常是一个复杂的过程,尤其是在处理循环和分支指令时。

数据竞态

在多线程环境中,当两个或多个线程同时访问共享数据时,可能会发生数据竞态。这可能导致数据损坏或程序行为不正确。指令级并行可能会加剧数据竞态,因为多个指令可以同时访问共享数据。

功耗和发热

指令级并行通常需要更多的处理器资源和更高的时钟频率,这会导致更高的功耗和发热。这对于移动设备和其他电池供电的系统是一个重要考虑因素。

性能限制

尽管指令级并行可以通过利用处理器资源来提高性能,但它受到Amdahl定律的限制。该定律指出,程序性能的改进受到程序中顺序部分大小的限制。因此,指令级并行只能提高可并行部分的性能,而不会显著提高整个程序的性能。

其他局限性

除了上述挑战外,指令级并行还受到以下局限性的影响:

*代码大小:指令级并行的优化通常会导致更大的代码大小。

*可扩展性:随着处理器内核数量的增加,指令级并行的可扩展性受到限制。

*调试难度:并行代码的调试比顺序代码的调试更具挑战性。

*非确定性:由于分支预测的不确定性,指令级并行代码可能表现出非确定性行为。

结论

指令级并行是一种提高处理器性能的有效技术。然而,它面临着依赖关系限制、复杂的分支预测、资源冲突、编译器复杂性、数据竞态、功耗和发热以及性能限制等挑战和局限性。这些因素限制了指令级并行的实际潜力,并且需要仔细权衡以实现效率与可行性的最佳平衡。第三部分依赖距离和循环迭代之间的关系关键词关键要点依存深度

1.依赖深度衡量了嵌套循环中一个赋值与后续使用之间指令的距离。

2.依赖深度用于确定指令之间是否可能存在数据依赖性,从而影响循环的并行化。

3.高依赖深度表明数据依赖性强,可能限制循环的并行化程度。

循环依赖距离

1.循环依赖距离考虑了循环迭代之间的依赖关系。

2.它确定了不同迭代中访问同一内存位置之间的指令距离。

3.循环依赖距离可以帮助识别循环中的循环依赖性,并指导循环并行化的策略选择。

循环携带依赖

1.循环携带依赖发生在一个循环中,其中一个迭代的结果被后续迭代使用。

2.循环携带依赖的存在会阻止循环的完全并行化,因为必须按顺序执行依赖的迭代。

3.优化技术可以用来消除或减少循环携带依赖,从而提高循环的并行性。

循环串行依赖

1.循环串行依赖发生在一个循环中,其中一个迭代必须在另一个迭代执行之前完成。

2.循环串行依赖限制了循环并行化的可能性,因为它强制执行特定迭代顺序。

3.依赖分析工具可以识别循环串行依赖,并指导并行化策略的制定。

循环反依赖

1.循环反依赖发生在一个循环中,其中一个迭代写入一个内存位置,而另一个迭代随后读取该位置。

2.循环反依赖可以通过重排序循环迭代来消除,从而允许更好的并行化。

3.依赖分析技术可以检测循环反依赖,并为消除它们提供建议。

循环输出依赖

1.循环输出依赖发生在一个循环中,其中一个迭代读取一个内存位置,而另一个迭代随后写入该位置。

2.循环输出依赖可以限制循环并行化的程度,因为必须按顺序执行相关的迭代。

3.优化技术可以用来消除或减少循环输出依赖,从而提高循环的并行性。循环嵌套中的依赖距离和循环迭代之间的关系

循环嵌套中,依赖距离和循环迭代之间的关系对于精确依赖分析至关重要。

依赖距离

依赖距离表示循环嵌套中的两个语句之间的依赖程度。它定义为两个语句在循环嵌套层次结构中相隔的循环迭代次数。例如,如果语句S1和S2在同一循环迭代中执行,则它们之间的依赖距离为0。如果S1在外部循环的第i次迭代中执行,而S2在内部循环的第j次迭代中执行,则它们的依赖距离为i+j。

循环迭代

循环迭代表示循环执行的特定次数。例如,对于循环i=1到n,循环迭代从1到n。

依赖距离和循环迭代之间的关系

对于循环嵌套,依赖距离和循环迭代之间的关系可以概括为以下规则:

*同一迭代内的依赖:如果两个语句在同一循环迭代中执行,则它们的依赖距离为0。

*循环嵌套内依赖:如果两个语句在不同的循环迭代中执行,但位于相同的循环嵌套内,则它们的依赖距离等于外部循环迭代次数之和。

*循环嵌套间依赖:如果两个语句位于不同的循环嵌套内,则它们的依赖距离等于外部循环嵌套中循环迭代次数之和加上内部循环嵌套中循环迭代次数之和。

示例

为了更好地理解这些规则,请考虑以下循环嵌套:

```

for(i=1ton)

for(j=1tom)

S1;

S2;

}

}

```

*S1和S2在同一循环迭代中执行,因此依赖距离为0。

*S1和S2在不同的循环迭代中执行,但位于相同的外部循环嵌套中,因此依赖距离为i。

*S1和S2位于不同的循环嵌套中,因此依赖距离为i+j。

应用

理解依赖距离和循环迭代之间的关系对于以下方面至关重要:

*依赖分析:确定循环嵌套中语句之间的依赖关系,这是代码优化和并行化的关键。

*循环转换:应用循环转换技术,如循环展开、循环嵌套互换和循环融合,以优化循环嵌套的性能。

*编译器优化:编译器利用依赖距离信息来执行指令调度、冗余消除和其他优化。第四部分GCD测试和循环不变式识别GCD测试

GCD(最大公约数)测试是一种数据依赖分析技术,用于确定循环变量之间的依赖关系。它基于以下原理:

*如果两个变量`x`和`y`在循环开头独立,并且在循环体内仅参与加法或减法操作,那么它们在循环末尾也是独立的。

*如果变量`x`和`y`在循环开头独立,并且在循环体内参与乘法或除法操作,那么它们在循环末尾可能变得相关。

GCD测试的算法如下:

1.对于循环中的每个变量`x`,求出其在循环开头和循环末尾的值的GCD。

2.如果循环开头和循环末尾的GCD相等,则`x`在循环中独立。

3.如果循环开头和循环末尾的GCD不相等,则`x`在循环中可能相关。

循环不变式识别

循环不变式识别是一种数据依赖分析技术,用于识别循环中保持不变的表达式。这些表达式对于确定循环变量之间的依赖关系非常有用。

循环不变式识别的算法如下:

1.初始化一个不变式集合`I`为循环中的初始条件。

2.对于循环中的每条语句,执行以下操作:

*如果该语句是赋值语句,则将`x=e`添加到`I`中,其中`x`是变量,`e`是表达式。

*如果该语句是条件语句,则将所有满足条件的表达式添加到`I`中。

*如果该语句是循环语句,则将所有循环不变式添加到`I`中。

*如果该语句是其他语句类型,则不执行任何操作。

3.返回`I`作为循环的不变式。

GCD测试和循环不变式识别的应用

GCD测试和循环不变式识别可以结合使用,以进行精确的数据依赖分析。通过识别循环不变式,可以确定哪些变量在循环中独立,哪些变量可能相关。然后,可以使用GCD测试来进一步分析相关变量之间的依赖关系。

这种结合方法特别适用于以下场景:

*确定循环变量之间的依赖关系以进行并行化。

*确定循环变量的范围以进行优化。

*检测循环中的数据hazards。第五部分精确依赖分析的算法和技术关键词关键要点主题名称:控制流依赖分析

1.确定程序中语句之间控制流依赖关系,即一个语句对另一个语句执行是否产生影响。

2.利用数据流分析技术,如到达定义(Def-Use)分析,来计算依赖关系。

3.应用于优化、并行化和错误检测等编译器优化技术。

主题名称:数据流分析

精确依赖分析的算法和技术

精确依赖分析的目的是确定程序中的数据和控制依赖关系,以改进编译器优化和程序分析。以下是精确依赖分析中常用的算法和技术:

数据依赖分析

*May分析:确定一对存储器操作之间可能存在的依赖关系,即使它们在执行时并不总是依赖。使用符号表和数据流分析来构建依赖图。

*Must分析:确定一对存储器操作之间必定存在的依赖关系,即它们每次执行时都依赖。基于May分析,使用消解技术去除不确定的依赖关系。

*Alias分析:确定程序中不同变量或内存位置之间的别名关系。有助于消除May分析中的虚假依赖关系。

控制依赖分析

*深度优先搜索:遍历控制流图,识别支配关系和后支配关系。

*结构化支配树(PDT):一种数据结构,表示程序的控制流,其中每个节点都支配其子树上的所有节点。

*后支配树(PDT):一种数据结构,表示程序的控制流,其中每个节点都被其子树上的所有节点后支配。

基于路径的依赖分析

*切片:提取程序中与特定变量或存储器位置相关的代码路径。

*路径敏感分析:考虑不同执行路径上的依赖关系。

*间接跳转分析:处理带有间接跳转的循环,例如switch语句和间接函数调用。

其他技术

*符号执行:执行程序并跟踪符号变量的值,以确定依赖关系。

*模型检查:使用有限状态机模型表示程序,并对其进行分析以查找依赖关系。

*约束求解:使用约束求解器来确定依赖关系的存在或不存在。

精确依赖分析的优势

精确依赖分析提供了高级别的依赖关系信息,为以下目的提供支持:

*循环优化:启用循环展开、向量化和软件流水线等优化。

*代码移动:在不违反依赖性的情况下,移动代码块。

*并行化:识别和剥离可并行的代码片段。

*内存管理:优化存储器分配和访问模式。

*程序分析:提高类型推理、错误检测和程序验证的准确性。

精确依赖分析的挑战

精确依赖分析也面临着一些挑战:

*计算成本:精确分析可能很耗时,对于大型程序而言尤其如此。

*不确定性:指针和输入依赖关系等因素可能引入不确定性,使精确分析变得困难。

*精度权衡:精确性和计算成本之间存在权衡,需要在特定应用程序中进行优化。

总的来说,精确依赖分析是程序分析和编译器优化的关键技术,它提供了对程序数据和控制依赖关系的深入理解。这些算法和技术有助于提高优化、并行化和程序分析的准确性,从而改进程序的性能和可靠性。第六部分循环嵌套中的循环展开和切片循环嵌套中的循环展开和切片

循环展开和切片是并行化循环嵌套的两种有效技术。

循环展开

循环展开是一种将循环体复制多次以增加粒度的方法。这可以通过创建一个新的循环来完成,该循环的步长是原始循环步长的倍数。展开因子指定要展开的循环次数。

优点:

*增加循环粒度,从而减少循环开销。

*提高数据局部性,因为展开后的循环体使用同一组数据。

缺点:

*增加代码大小和编译时间。

*可能导致资源竞争,因为展开后的循环体并行执行。

循环切片

循环切片是一种将循环体分割成多个较小部分的方法。这可以通过创建一个新的循环来完成,该循环的步长较小,并且包含循环体的一部分。切片因子指定要切片的循环次数。

优点:

*减少循环粒度,从而增加并行性。

*提高负载平衡,因为每个切片可以分配给不同的处理器。

缺点:

*增加循环开销,因为有多个循环要执行。

*可能导致数据依赖问题,因为不同的切片可能访问相同的数据。

循环展开和切片对比

下表总结了循环展开和循环切片之间的主要区别:

|特征|循环展开|循环切片|

||||

|目标|增加粒度|减少粒度|

|方法|创建一个步长更大的新循环|创建一个步长更小的循环|

|粒度|增加|减少|

|数据局部性|提高|可能降低|

|资源竞争|可能增加|可能降低|

|负载平衡|不受影响|提高|

|循环开销|减少|增加|

|数据依赖问题|可能减少|可能增加|

选择循环展开或切片

选择循环展开或切片取决于特定循环嵌套的特征,例如:

*数据依赖性

*循环体大小

*循环嵌套深度

*并行性目标

一般来说,如果循环嵌套具有较少的依赖性、较大的循环体和较浅的嵌套深度,则循环展开可能是更好的选择。如果循环嵌套具有较多的依赖性、较小的循环体和较深的嵌套深度,则循环切片可能是更好的选择。

示例

考虑以下循环嵌套:

```

for(i=0;i<N;i++)

for(j=0;j<M;j++)

A[i][j]=B[i][j]+C[i][j];

}

}

```

*循环展开:展开外部循环可以增加粒度并减少循环开销:

```

for(i=0;i<N;i+=2)

for(j=0;j<M;j++)

A[i][j]=B[i][j]+C[i][j];

A[i+1][j]=B[i+1][j]+C[i+1][j];

}

}

```

*循环切片:切片内部循环可以减少粒度并增加并行性:

```

for(i=0;i<N;i++)

for(j=0;j<M;j+=2)

A[i][j]=B[i][j]+C[i][j];

A[i][j+1]=B[i][j+1]+C[i][j+1];

}

}

```第七部分依赖分析在编译器优化中的应用关键词关键要点程序并行化

1.精确依赖分析可识别循环嵌套中的并行机会,如OpenMP和CUDA等编程环境中利用。

2.通过确定循环迭代之间的依赖关系,可以安全地将循环分解为并行任务,从而提高程序性能。

3.精确分析可以减少同步开销和锁争用,优化并行化代码的效率。

循环优化

1.依赖分析有助于识别重复计算和循环展开机会,从而提高循环执行效率。

2.通过确定循环中的循环不变式和循环依赖,可以应用循环融合和分布等优化技术。

3.精确分析可以指导循环调度和代码生成,优化循环执行顺序和内存访问模式。依赖分析在编译器优化中的应用

依赖分析是编译器优化中的关键技术,旨在确定程序指令之间的依赖关系,以便优化器识别和消除不必要的计算。通过准确识别依赖关系,编译器可以执行以下优化:

1.公共子表达式消除(CSE)

CSE优化识别并消除表达式计算的重复实例。依赖分析用于确定哪些表达式不依赖于其他表达式,以便编译器可以安全地消除重复计算。

2.冗余加载消除(RLE)

RLE优化识别并消除对不依赖于其他加载的内存位置的冗余加载。依赖分析用于确定哪些加载不依赖于其他加载,以便编译器可以安全地消除冗余加载。

3.代码移动

代码移动优化通过将指令移动到程序中更合适的位置来提高性能。依赖分析用于确定哪些指令可以安全地移动,而不会改变程序的语义。

4.寄存器分配

寄存器分配优化将程序中的变量分配到寄存器中,以减少内存访问。依赖分析用于确定哪些变量不依赖于其他变量,以便编译器可以安全地将它们分配到寄存器中。

5.流水线调度

流水线调度优化将指令重新排序为流水线中的执行。依赖分析用于确定哪些指令可以并行执行,而不违反程序的语义。

6.内存分配

内存分配优化确定程序中变量所需的内存数量和位置。依赖分析用于确定哪些变量可以共享内存位置,以便编译器可以优化内存使用。

7.循环展开

循环展开优化将循环主体复制多次,以增加并行性。依赖分析用于确定哪些循环可以安全地展开,而不会改变程序的语义。

8.循环融合

循环融合优化将多个循环合并为一个更长的循环。依赖分析用于确定哪些循环可以安全地融合,而不会改变程序的语义。

9.预取

预取优化在程序访问数据之前提前加载数据到高速缓存中。依赖分析用于确定哪些数据访问不依赖于其他数据访问,以便编译器可以安全地预取数据。

10.推测执行

推测执行优化在预测的分支结果上执行指令。依赖分析用于确定哪些指令可以安全地推测执行,而不会改变程序的语义。

总之,依赖分析在编译器优化中至关重要,因为它提供了指令之间依赖关系的精确信息。通过利用此信息,优化器可以执行各种优化,以提高程序的性能、减少内存使用并缩短执行时间。第八部分提高循环嵌套分析精度的方法提高循环嵌套分析精度的方法

循环嵌套分析是编译中的一项关键技术,用于识别和利用循环中的并行性。为了实现高精度的分析,需要采用以下方法:

1.精确查找循环依赖

*方向向量分析:计算循环迭代期间数据流动的方向向量,以识别依赖关系。

*赋值链分析:跟踪变量赋值之间的关系,以确定数据流依赖关系。

*符号常量传播:传播符号常量以简化表达式,并提高依赖分析的精度。

2.分离环控流

*环控检测:识别循环中控制流的改变,将循环分解为独立的部分,从而简化分析。

*环控消除:通过循环不变式条件代码传播等技术,消除循环环控,改善分析精度。

3.考虑关联数组和指针

*关联数组分析:识别和利用关联数组的特殊特性,例如哈希表和散列表,以提高分析精度。

*指针分析:分析指针引用,以准确确定内存访问模式和数据依赖关系。

4.采用机器学习和静态分析

*机器学习:训练模型以识别依赖关系模式,并提高分析的整体精度。

*静态分析:应用抽象解释和模式匹配等技术,以静态方式推断循环依赖关系。

5.优化分析过程

*循环嵌套分解:将复杂的循环嵌套分解为较小的、更容易分析的嵌套。

*逐步细化分析:从粗略的分析开始,逐步细化分析,以提高精度。

*循环不变式传播:识别循环中不随迭代而变化的变量,并将其传播到循环体中,以简化分析。

6.结合动态分析

*循环分析插装器:在运行时插入代码,以收集循环执行的实际依赖关系信息。

*性能监控:监视循环执行,以识别实际出现的依赖关系。

7.特殊情况处理

*递归循环:制定专门的算法和数据结构来处理递归循环的分析。

*非线性访问模式:采用专门的技术来分析具有非线性内存访问模式的循环。

*动态循环边界:考虑循环边界在执行期间可能会改变的情况。

8.使用保守分析

当无法获得精确的依赖信息时,可以使用保守分析来保证正确性。保守分析假设存在依赖关系,即使实际上可能不存在。

9.评估和验证结果

*测试套件:开发测试套件以验证分析结果的正确性。

*可视化工具:使用可视化工具来检查依赖关系图,并识别错误或不准确的分析。

*代码生成器:将分析结果用于代码生成,并评估生成的代码的性能。关键词关键要点【循环嵌套依赖分析概述】

关键词关键要点主题名称:存储器的带宽瓶颈

关键要点:

1.指令级并行(ILP)试图通过并发执行多个指令来提高性能。

2.然而,处理器访问内存所需的大量带宽成为ILP的瓶颈。

3.传统存储器层次结构无法以足够快的速度提供数据来支持高ILP水平。

主题名称:控制流预测的限制

关键要点:

1.ILP依赖于准确地预测分支和跳转指令。

2.对于复杂且难以预测的代码,控制流预测器可能不准确,导致流水线停顿。

3.分支误预测会浪费指令资源和增加执行时间。

主题名称:指令调度限制

关键要点:

1.ILP需要高效的指令调度器来确保指令按正确顺序执行。

2.依赖性分析和资源分配优化对于最大化并发性至关重要。

3.复杂指令依赖性和限制作用器可用性会限制ILP的有效性。

主题名称:取指限制

关键要点:

1.ILP依赖于能够快速获取指令。

2.传统取指机制可能成为瓶颈,尤其是在指令高速缓存未命中时。

3.预取和投机执行等技术可以帮助缓解取指限制。

主题名称:功耗和散热问题

关键要点:

1.ILP处理器通常需要更高的功耗,因为它需要更多的计算资源和带宽。

2.高功耗会产生散热问题,需要昂贵的散热解决方案。

3.过高的功耗和散热会限制ILP处理器的可扩展性和实用性。

主题名称:可扩展性和成本

关键要点:

1.支持高ILP的处理器通常更复杂和昂贵。

2.扩展ILP水平会增加成本和复杂性,使其难以大规模部署。

3.实用性需要在性能、成本和可扩展性之间进行权衡。关键词关键要点GCD测试

关键要点:

1.GCD(最大公约数)测试用于确定循环执行次数,通过求取循环变量与一个常数的GCD来计算。

2.如果GCD为1,则循环会执行所有可能的迭代。

3.如果GCD大于1,则循环会跳过一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论