1.3.1 基本的处理器体系结构
您可以访问和影响的部件包括寄存器、主存储器、虚拟内存、指令集使用以及目标代码优化。在试图与多处理器体系结构打交道之前,理解在单处理器架构中可以影响哪些部件非常重要。图1-2给出了简化的处理器架构和内存部件的逻辑概览。
|
| (点击查看大图)图1-2 |
处理器架构有很多变体,图1-2只是一个逻辑概览。它说明了您可以使用的主要处理器部件。尽管这个级别的细节和这些部件对特定类型的应用程序开发经常是透明的,但是它们在自底向上多核编程(www.cppentry.com)和以加速和性能优化为主要目的的软件开发中都发挥着核心作用。与处理器的主要接口是编译器。操作系统是二级接口。
注意:
在本书中,我们将使用C++(www.cppentry.com)编译器来生成目标代码。并行编程(www.cppentry.com)可用于使用多种方法的所有类型的应用程序,从低级到高级,从面向对象到结构化应用程序。C++(www.cppentry.com)支持多范型编程(www.cppentry.com)方法,因为其拥有较强灵活性,所以我们会选择使用它。
表1-1给出了编译器与CPU和指令集交互的类别清单。包括浮点类别、寄存器操纵类别和内存模型类别。
表1-1
|
编译器开关选项< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
描 述 |
使用的示例 |
|
Vectorization |
这个选项将激活vectorizer,
它是编译器中的一个组件,
自动在MMX寄存器中
使用单指令多数据(Single
Instruction Multiple Data,
SIMD)指令以及所有SSE指令集 |
-x -ax
激活vectorizer |
|
Auto parallelization |
这个选项识别包含并行
性的循环结构,然后
(如果可能)安全生成并
行执行的多线程等价体 |
-parallel
触发自动并行化 |
|
Parallelization
with OpenMP |
使用这个选项,编译器基
于程序员在源码中加入
的OpenMP指示来生
成多线程代码 |
#pragma omp parallel
{
#pragma omp for
//your code
} |
|
Fast |
这个选项用于检测不
兼容的处理器,在执行
中生成错误消息 |
-O1
为代码规模和代码局
部性进行优化,并禁
用循环展开、软件流水
和全局代码调度
-O2
默认值,将软件流水置为ON |
|
Floating point |
允许编译器影响对浮
点指令的选择和使用的一组开关 |
-fschedule-insns
告诉编译器可以发送
其他指令,直到要求
一个浮点指令的结果为止
-float-store
告诉编译器在生成目标
代码时不使用在
寄存器中存放浮点变量的指令 |
(续表)
|
编译器开关选项 |
描 述 |
使 用 实 例 |
|
Loop unrolling |
这个选项用于激活循
环展开;它只应用于
编译器被确定为应当
被展开的循环;如果
将n省略,则由编译
器决定是否进行展开 |
-unroll<n>
激活循环展开,<n>设
置循环展开的最大次数
n=0
禁用循环展开,仅为64
位架构下的容许值 |
|
Memory bandwidth |
这个选项用于激活或禁
用对处理器使用的内存
带宽的控制;如果禁用,
则带宽会在多个线程
间完全共享;可以和
auto parallelization选
项一同使用;这个选
项仅用于64位架构 |
-opt-mem-bandwidth<n>
n=2
为并行代码(如pthreads
和MPI代码)激活编译器优化
n=1
为编译器生成的多线程
代码激活编译器优化 |
|
Code generation |
使用这个选项代码,
为特定架构或处理器
进行代码优化;如果
有性能收益,编译器
生成多条、处理器特
定的代码路径;用于
32位及64位架构 |
-ax<processor>
为指定处理器生成优化代码
-axS
使用SIMD Extensions 4(SSE4)
向量编译器和媒体加速器
指令生成专门的代码路径 |
|
Thread checking |
这个选项激活使用线
程的应用程序或程
序中的线程分析,
只能和Intel的
Thread Checker工
具一同使用 |
-tcheck
激活使用线程的应用程序
或程序的分析 |
|
Thread library |
这个选项使得编译
器包含来自Thread
Library的代码;程
序员需要在源代码中包含API调用 |
-pthread
针对多线程支持使用pthread库 |