当前位置:文档之家› openmp简介(DOC)

openmp简介(DOC)

openmp简介(DOC)
openmp简介(DOC)

OpenMP编程基础

1、可以说OpenMP制导指令将C语言扩展为一个并行语言,但OpenMP本身不是一种独立的并行语

言,而是为多处理器上编写并行程序而设计的、指导共享内存、多线程并行的编译制导指令和应用程序编程接口(API),可在C/C++和Fortran(77、90和95)中应用,并在串行代码中以编译器可识别的注释形式出现。OpenMP标准是由一些具有国际影响力的软件和硬件厂商共同定义和提出,是一种在共享存储体系结构的可移植编程模型,广泛应用与Unix、Linux、Windows等多种平台上。

2.1 OpenMP基本概念

首先来了解OpenMP的执行模式和三大要素。

2.1.1 执行模式

OpenMP的执行模型采用fork-join的形式,其中fork创建新线程或者唤醒已有线程;join即多线程的会合。fork-join执行模型在刚开始执行的时候,只有一个称为“主线程”的运行线程存在。主线程在运行过程中,当遇到需要进行并行计算的时候,派生出线程来执行并行任务。在并行执行的时候,主线程和派生线程共同工作。在并行代码执行结束后,派生线程退出或者阻塞,不再工作,控制流程回到单独的主线程中。

OpenMP的编程者需要在可并行工作的代码部分用制导指令向编译器指出其并行属性,而且这些并行区域可以出现嵌套的情况,如图2.1所示。

对并行域(Paralle region)作如下定义:在成对的fork和join之间的区域,称为并行域,它既表示代码也表示执行时间区间。

对OpenMP线程作如下定义:在OpenMP程序中用于完成计算任务的一个执行流的执行实体,可

以是操作系统的线程也可以是操作系统上的进程。

2.1.2 OpenMP编程要素

OpenMP编程模型以线程为基础,通过编译制导指令来显式地指导并行化,OpenMP为编程人员提供了三种编程要素来实现对并行化的完善控制。它们是编译制导、API函数集和环境变量。

编译制导

在C/C++程序中,OpenMP的所有编译制导指令是以#pragma omp开始,后面跟具体的功能指令(或命令),其具有如下形式:

#pragma omp 指令[子句[, 子句] …]

支持OpenMP的编译器能识别、处理这些制导指令并实现其功能。其中指令或命令是可以单独出现的,而子句则必须出现在制导指令之后。制导指令和子句按照功能可以大体上分成四类:

1)并行域控制类;

2)任务分担类;

3)同步控制类;

并行域控制类指令用于指示编译器产生多个线程以并发执行任务,任务分担类指令指示编译器如何给各个并发线程分发任务,同步控制类指令指示编译器协调并发线程之间的时间约束关系等。

1)OpenMP规范中的指令有以下这些:

? parallel:用在一个结构块之前,表示这段代码将被多个线程并行执行;

? for:用于for循环语句之前,表示将循环计算任务分配到多个线程中并行执行,以实现任务分担,必须由编程人员自己保证每次循环之间无数据相关性;

? parallel for:parallel 和for指令的结合,也是用在for循环语句之前,表示for循环体的代码将被多个线程并行执行,它同时具有并行域的产生和任务分担两个功能;

? sections:用在可被并行执行的代码段之前,用于实现多个结构块语句的任务分担,可并行执行的代码段各自用section指令标出(注意区分sections和section);

? parallel sections:parallel和sections两个语句的结合,类似于parallel for;

? single:用在并行域内,表示一段只被单个线程执行的代码;

? critical:用在一段代码临界区之前,保证每次只有一个OpenMP线程进入;

? flush:保证各个OpenMP线程的数据影像的一致性;

? barrier:用于并行域内代码的线程同步,线程执行到barrier时要停下等待,直到所有线程都执行到barrier时才继续往下执行;

? atomic:用于指定一个数据操作需要原子性地完成;

? master:用于指定一段代码由主线程执行;

? threadprivate:用于指定一个或多个变量是线程专用,后面会解释线程专有和私有的区别。

2)相应的OpenMP的子句有以下一些:

? private:指定一个或多个变量在每个线程中都有它自己的私有副本;

? firstprivate:指定一个或多个变量在每个线程都有它自己的私有副本,并且私有变量要在进入并行域或任务分担域时,继承主线程中的同名变量的值作为初值;

? lastprivate:是用来指定将线程中的一个或多个私有变量的值在并行处理结束后复制到主线程中的同名变量中,负责拷贝的线程是for或sections任务分担中的最后一个线程;

? reduction:用来指定一个或多个变量是私有的,并且在并行处理结束后这些变量要执行指定的归约运算,并将结果返回给主线程同名变量;

? nowait:指出并发线程可以忽略其他制导指令暗含的路障同步;

? num_threads:指定并行域内的线程的数目;

? schedule:指定for任务分担中的任务分配调度类型;

? shared:指定一个或多个变量为多个线程间的共享变量;

? ordered:用来指定for任务分担域内指定代码段需要按照串行循环次序执行;

? copyprivate:配合single指令,将指定线程的专有变量广播到并行域内其他线程的同名变量中;

? copyin:用来指定一个threadprivate类型的变量需要用主线程同名变量进行初始化;

? default:用来指定并行域内的变量的使用方式,缺省是shared。

这些制导指令将会在后面的编程部分进行详细说明解释。

API函数

除上述编译制导指令之外,OpenMP还提供了一组API函数用于控制并发线程的某些行为,下面列出OpenMP 2.5所有的API函数:

环境变量

OpenMP规范定义了一些环境变量,可以在一定程度上控制OpenMP程序的行为。以下是开发过程中常用的环境变量

1. OMP_SCHEDULE:用于for循环并行化后的调度,它的值就是循环调度的类型;

2. OMP_NUM_THREADS:用于设置并行域中的线程数;

3. OMP_DYNAMIC:通过设定变量值,来确定是否允许动态设定并行域内的线程数;

4. OMP_NESTED:指出是否可以并行嵌套。

2.2 OpenMP编程

下面的内容按照功能进行划分,每个功能部分将可能综合使用编译制导、环境变量和OpenMP API 函数这三种要素。

2.2.1 并行域管理

设计并行程序时,首先需要多个线程来并发地执行任务,因此OpenMP编程中第一步就是应该掌握如何产生出多个线程。如前面所实,在OpenMP的相邻的fork、join操作之间我们称之为一个并行域,并行域可以嵌套。parallel制导指令就是用来创建并行域的,它也可以和其他指令如for、sections等配合使用形成复合指令。

在C/C++中,parallel的使用方法如下:

#pragma omp parallel [for | sections] [子句[子句]…]

{

...代码...

}

parallel语句后面要用一个大括号对将要并行执行的代码括起来。

1. void main(int argc, char *argv[]) {

2. #pragma omp parallel

3. { 并行域的开始(对应fork)

4. printf(“Hello, World!\n”);

5. } 并行域的结束(对应join)

6. }

执行以上代码将会打印出以下结果

Hello, World!

Hello, World!

Hello, World!

Hello, World!

可以看得出parallel语句中的代码被“相同”地执行了4次,说明总共创建了4个线程来执行parallel语句中的代码。为了指定使用多少个线程来执行,可以通过设置环境变量OMP_NUM_THREADS或者调用omp_set_num_theads()函数,也可以使用num_threads子句,前者只能在程序刚开始运行时起作用,而API函数和子句可以在程序中并行域产生之前起作用。使用num_threads子句的例子如下:

1. void main(int argc, char *argv[]) {

2. #pragma omp parallel num_threads(8)

3. {

4. printf(“Hello, World!, ThreadId=%d\n”, omp_get_thread_num() );

5. }

6. }

执行以上代码,将会打印出以下结果:

Hello, World!, ThreadId = 2

Hello, World!, ThreadId = 6

Hello, World!, ThreadId = 4

Hello, World!, ThreadId = 0

Hello, World!, ThreadId = 5

Hello, World!, ThreadId = 7

Hello, World!, ThreadId = 1

Hello, World!, ThreadId = 3

从ThreadId的不同可以看出创建了8个线程来执行以上代码。所以parallel指令是用来产生或唤醒多个线程创建并行域的,并且可以用num_threads子句控制线程数目。parallel域中的每行代码都被多个线程重复执行。和传统的创建线程函数比起来,其过程非常简单直观。

parallel的并行域内部代码中,若再出现parallel制导指令则出现并行嵌套问题,如果设置了OMP_NESTED环境变量,那么在条件许可时内部并行域也会由多个线程执行,反之没有设置相应变量,那么内部并行域的代码将只由一个线程来执行。还有一个环境变量OMP_DYNAMIC也影响并行域的行为,如果没有设置该环境变量将不允许动态调整并行域内的线程数目,omp_set_dynamic()也是用于同样的目的。

2.2.2 任务分担

当使用parellel制导指令产生出并行域之后,如果仅仅是多个线程执行完全相同的任务,那么只是徒增计算工作量而不能达到加速计算的目的,甚至可能相互干扰得出错误结果。因此在产生出并行域之后,紧接着的问题就是如何将计算任务在这些线程之间分配,并加快计算结果的生成速度及其保证正确性。OpenMP可以完成的任务分担的指令只有for、sections和single,严格意义上来说只有for和sections是任务分担指令,而single只是协助任务分担的指令。

我们对任务分担域定义如下:由for、sections或single制导指令限定的代码及其执行时间段,也就是说任务分担域和并行域的定义一样,既是指代码区间也是之执行时间区间。

for 制导指令

for指令指定紧随它的循环语句必须由线程组并行执行,用来将一个for循环任务分配到多个线程,此时各个线程各自分担其中一部分工作。for指令一般可以和parallel指令合起来形成parallel for指令使用,也可以单独用在parallel指令的并行域中。用法如下:

#pragma omp [parallel] for [子句]

for循环语句

先看看单独使用for语句时是什么效果:

1. int j = 0;

2. #pragma omp for

3. for ( j = 0; j < 4; j++ )

{

4. printf(“j = %d, ThreadId = %d\n”, j, omp_get_thread_num());

5. }

执行以上代码后打印出以下结果

j = 0, ThreadId = 0

j = 1, ThreadId = 0

j = 2, ThreadId = 0

j = 3, ThreadId = 0

从结果可以看,4次循环都在一个ThreadId为0的线程里执行,并没有实现并发执行也不会加快计算速度。可见for指令要和parallel指令结合起来使用才有效果,即for出现在并行域中才能有多个线程来分担任务。以下代码就是parallel 和for一起结合使用的形式:

1. int j = 0;

2. #pragma omp parallel

3. {

4. #pragma omp for

5. for ( j = 0; j < 4; j++ ){

6. printf(“j = %d, ThreadId = %d\n”, j, omp_get_thread_num());

7. }

8. }

执行以上代码会打印出以下结果:

j = 1, ThreadId = 1

j = 3, ThreadId = 3

j = 2, ThreadId = 2

j = 0, ThreadId = 0

此时,循环计算任务被正确分配到4个不同的线程中执行,各自只需要执行一次循环(总的串行循环次数为4,4个线程每个线程承担1/4,即1次)即可。

上面这段代码也可以改写成以下parallel for复合制导指令的形式:

1. int j = 0;

2. #pragma omp parallel for

3. for ( j = 0; j < 4; j++ ){

4. printf(“j = %d, ThreadId = %d\n”, j, omp_get_thread_num());

5. }

如果并行域中有4个线程,执行后会打印出相同的结果:

j = 0, ThreadId = 0

j = 2, ThreadId = 2

j = 1, ThreadId = 1

j = 3, ThreadId = 3

现在考虑另一个情况,在一个parallel 并行域中,可以有多个for制导指令,如:

1. int j;

2. #pragma omp parallel

3. {

4. #pragma omp for

5. for ( j = 0; j < 100; j++ ){

6. …

7. }

8. #pragma omp for

9. for ( j = 0; j < 100; j++ ){

10. …

11. }

12. …

13. }

此时只有一个并行域,在该并行域内的多个线程首先完成第一个for语句的任务分担,然后在此进行一次同步(for制导指令本身隐含有结束处的路障同步),然后再进行第二个for语句的任务分担,直到退出并行域并只剩下一个主线程为止。

for调度

在OpenMP的for任务分担中,任务的划分称为调度,各个线程如何划分任务是可以调整的,因此有静态划分、动态划分等,所以调度也分成多个类型。for任务调度子句只能用于for制导指令中,下面先来看看提供多种调度类型的必要性。

当循环中每次迭代的计算量不相等时,如果简单地给各个线程分配相同次数的迭代的话,会使得各个线程计算负载不均衡,这会使得有些线程先执行完,有些后执行完,造成某些CPU核空闲,影响程序性能。例如:

1. int i, j;

2. int a[100][100] = {0};

3. for ( i =0; i < 100; i++)

4. {

5. for( j = i; j < 100; j++ )

6. a[i][j] = i*j;

7. }

如果将最外层循环并行化的话,比如使用4个线程,如果给每个线程平均分配25次循环迭代计算

的话,显然i=0和i=99的计算量相差了100倍,那么各个线程间可能出现较大的负载不平衡情况。为了解决这些问题,适应不同的计算类型,OpenMP中提供了几种对for循环并行化的任务调度方案。

在OpenMP中,对for循环任务调度使用schedule子句来实现,下面介绍schedule子句的用法。

1)schedule子句用法

schedule子句的使用格式为:

schedule (type [, size])

schedule有两个参数:type和size,size参数是可选的。如果没有指定size大小,循环迭代会尽可能平均地分配给每个线程。

①type参数

表示调度类型,有四种调度类型如下:

·static

·dynamic

·guided

·runtime

这四种调度类型实际上只有static、dynamic、guided三种调度方式。runtime实际上是根据环境变量OMP_SCHEDULED来选择前三种中的某种类型,相应的内部控制变量ICV是run-sched-var。

②size参数(可选)

size参数表示以循环迭代次数计算的划分单位,每个线程所承担的计算任务对应于0个或若干个size次循环,size参数必须是整数。static、dynamic、guided三种调度方式都可以使用size参数,也可以不使用size参数。当type参数类型为runtime时,size参数是非法的(不需要使用,如果使用的话编译器会报错)。

2)static静态调度

当for或者parallel for编译制导指令没有带schedule子句时,大部分系统中默认采用size 为1的static调度方式,这种调度方式非常简单。假设有n次循环迭代,t个线程,那么给每个线程静态分配大约n/t次迭代计算。这里为什么说大约分配n/t次呢?因为n/t不一定是整数,因此实际分配的迭代次数可能存在差1的情况,如果指定了size参数的话,那么可能相差size次迭代。

静态调度时可以不使用size参数,也可以使用size参数。

①不使用size参数

不使用size参数时,分配给每个线程的是n/t次连续的迭代,不使用size参数的用法如下:

schedule(static)

例如以下代码:

1. #pragma omp parallel for schedule(static)

2. for(i = 0; i < 10; i++ )

3. {

4. printf("i=%d, thread_id=%d\n", i, omp_get_thread_num());

5. }

假设并行域中有两个线程,上面代码执行时打印的结果如下:

i=0, thread_id=0

i=1, thread_id=0

i=2, thread_id=0

i=3, thread_id=0

i=4, thread_id=0

i=5, thread_id=1

i=6, thread_id=1

i=7, thread_id=1

i=8, thread_id=1

i=9, thread_id=1

可以看出线程0得到了i=0~4的连续迭代,线程1得到i=5~9的连续迭代。注意由于多线程执行时序的随机性,每次执行时打印的结果顺序可能存在差别,后面的例子也一样。

②使用size参数

使用size参数时,分配给每个线程的size次连续的迭代计算,用法如下:

schedule(static, size)

例如以下代码:

1. #pragma omp parallel for schedule(static, 2)

2. for(i = 0; i < 10; i++ )

3. {

4. printf("i=%d, thread_id=%d\n", i, omp_get_thread_num());

5. }

若使用两个线程的并行域,执行时会打印以下结果:

i=0, thread_id=0

i=1, thread_id=0

i=4, thread_id=0

i=5, thread_id=0

i=8, thread_id=0

i=9, thread_id=0

i=2, thread_id=1

i=3, thread_id=1

i=6, thread_id=1

i=7, thread_id=1

从打印结果可以看出,0、1次迭代分配给0号线程,2、3次迭代分配给1线程号,4、5次迭代分配给0号线程,6、7次迭代分配给1号线程,…。每个线程依次分配到2次(即size)连续的迭代计算。

3)dynamic动态调度

动态调度是动态地将迭代分配到各个线程,动态调度可以使用size参数也可以不使用size参数,不使用size参数时是根据各个线程的完成情况将迭代逐个地分配到各个线程,使用size参数时,每次分配给线程的迭代次数为指定的size次。各线程动态的申请任务,因此较快的线程可能申请更多次数,而较慢的线程申请任务次数可能较少,因此动态调度可以在一定程度上避免前面提到的按循环次数划分引起的负载不平衡问题。

①下面为使用动态调度不带size参数的例子:

1. #pragma omp parallel for schedule(dynamic)

2. for(i = 0; i < 10; i++ )

3. {

4. printf("i=%d, thread_id=%d\n", i, omp_get_thread_num());

5. }

如果并行域使用两个线程,打印结果如下:

i=0, thread_id=0

i=1, thread_id=1

i=2, thread_id=0

i=3, thread_id=1

i=5, thread_id=1

i=6, thread_id=1

i=7, thread_id=1

i=8, thread_id=1

i=4, thread_id=0

i=9, thread_id=1

由于没有指定size所以任务划分是按1此迭代进行的。

②下面为动态调度使用size参数的例子:

1. #pragma omp parallel for schedule(dynamic, 2)

2. for(i = 0; i < 10; i++ )

3. {

4. printf("i=%d, thread_id=%d\n", i, omp_get_thread_num());

5. }

打印结果如下:

i=0, thread_id=0

i=1, thread_id=0

i=4, thread_id=0

i=2, thread_id=1

i=5, thread_id=0

i=3, thread_id=1

i=6, thread_id=0

i=8, thread_id=1

i=7, thread_id=0

i=9, thread_id=1

从打印结果可以看出第“0、1”,“4、5”,“6、7”次迭代被分配给了线程0,第“2、3”,“8、9”次迭代则分配给了线程1,每次分配的迭代次数为2。较快的线程“抢到”了更多的任务。

动态调度时,size小有利于实现更好的负载均衡,但是会引起过多的任务动态申请的开销,反之size大则开销较少,但是不易于实现负在平衡,size的选择需要在这两者之间进行权衡。

4)guided调度

guided调度是一种采用指导性的启发式自调度方法。开始时每个线程会分配到较大的迭代块,之后分配到的迭代块会逐渐递减。迭代块的大小会按指数级下降到指定的size 大小,如果没有指定size参数,那么迭代块大小最小会降到1。

5)runtime调度

runtime调度并不是像前面三种调度方式那样是真实调度方式,它是在运行时根据环境变量OMP_SCHEDULE来确定调度类型,最终使用的调度类型仍然是上述三种调度方式中的一种。

例如在unix系统中,可以使用setenv命令来设置OMP_SCHEDULE环境变量:

setenv OMP_SCHEDULE “dynamic, 2”

如果程序中选择runtime调度,那么上述命令设置调度类型为动态调度,动态调度的size为2。在windows环境中,可以在“系统属性|高级|环境变量”对话框中进行设置环境变量。

sections 制导指令

sections编译制导指令是用于非迭代计算的任务分担,它将sections语句里的代码用section制导指令划分成几个不同的段(可以是一条语句,也可以是用{...}括起来的结构块),不同的section段由不同的线程并行执行。用法如下:

#pragma omp [parallel] sections [子句]

{

#pragma omp section

{

...代码块...

}

[#pragma omp section]

...

}

先看一下以下具有三个section的例子代码:

1. void main(int argc, char *argv)

2. {

3. #pragma omp parallel sections {

4. #pragma omp section

5. printf(“section 1 thread = %d\n”, omp_get_thread_num());

6. #pragma omp section

7. printf(“section 2 thread = %d\n”, omp_get_thread_num());

8. #pragma omp section

9. printf(“section 3 thread = %d\n”, omp_get_thread_num());

10. }

执行后将打印出以下结果:

section 1 thread = 0

section 2 thread = 2

section 3 thread = 1

此时,各个section里的代码是被分配到不同的线程并发地执行。

single制导指令

单线程执行single制导指令指定所包含的代码段只由一个线程执行,别的线程跳过这段代码。如果没有nowait从句,所有线程在single制导指令结束处隐式同步点同步。如果single制导指令有nowait从句,则别的线程直接向下执行,不在隐式同步点等待;single制导指令用在一段只被单个线程执行的代码段之前,表示后面的代码段将被单线程执行,具体用法如下:

#pragma omp single [子句]

对于如下范例代码:

1. #include

2. int main(int argc,void **argv )

3. {

4. #pragma omp parallel

5. {

6. #pragma omp single

7. printf (“Beginning work1.\n”);

8. printf(“work on 1 parallelly. %d\n”,omp_get_thread_num());

9. #pragma omp single

10. printf (“Finishing work1.\n”);

11. #pragma omp single nowait

12. printf (“Beginning work2.\n”);

13. printf(“work on 2 parallelly. %d\n”,omp_get_thread_num());;

14. }

15. }

对应的输出结果如下:

Beginning work1.

work on 1 parallelly. 0

work on 1 parallelly. 3

work on 1 parallelly. 2

work on 1 parallelly. 1

Finishing work1.

Beginning work2.

work on 2 parallelly. 1

work on 2 parallelly. 3

work on 2 parallelly. 2

work on 2 parallelly. 0

从上面的结果可以看出,在并行域内有多个线程并发执行,因此“work on 1/2 parallel”将由4个线程并发执行,但是对于使用single语句制导的“Beginning work1/2”以及“Finishing work1”的打印语句只有一个线程在执行。

2.2.3 同步

在正确产生并行域并用for、sections等语句进行任务分担后,还须考虑的是这些并发线程的同步互斥需求。在OpenMP应用程序中,由于是多线程执行,所以必须有线程互斥机制以保证程序在出现数据竞争的时候能够得出正确的结果,并且能控制线程执行的先后制约关系,以保证执行结果的正确性。

OpenMP支持两种不同类型的线程同步机制,一种是互斥锁的机制,可以用来保护一块共享的存储空间,使任何时候访问这块共享内存空间的线程最多只有一个,从而保证了数据的完整性;另外一种同步机制是事件同步机制,这种机制保证了多个线程制之间的执行顺序。互斥的操作针对需要保护的数据而言,在产生了数据竞争的内存区域加入互斥,可以使用包括critical、atomic等制导指令以及API中的互斥函数。而事件机制则控制线程执行顺序,包括barrier同步路障、ordered定序区段、matser 主线程执行等。

critical临界区

在可能产生内存数据访问竞争的地方,都需要插入相应的临界区制导指令,临界区编译制导指令的格式如下:

#pragam omp critical [(name)]

{ 需保护的代码段}

其中的名字name不是必需的。例如以下代码:

1. int i; int max_num_x=max_num_y=-1;

2. #pragma omp parallel for

3. for (i=0; i

4. {

5. #pragma omp critical (max_arx)

6. if (arx[i] > max_num_x)

7. max_num_x = arx[i];

8. #pragma omp critical (max_ary)

9. If (ary[i] > max_num_y)

10. max_num_y = ary[i];

11. }

在一个并行域内的for任务分担域中,各个线程逐个进入到critical保护的区域内,比较当前元素和最大值的关系并可能进行最大值的更替,从而避免了数据竞争的情况。critical语句不允许互相嵌套。atomic原子操作

在OpenMP的程序中,原子操作的功能是通过#pragma omp atomic编译制导指令提供的。前面提到的critical临界区操作能够作用在任意大小的代码块上,而原子操作只能作用在单条赋值语句中。在C/C++语言中,原子操作的语法格式如下所示:

#pragma omp atomic

x =expr

或者

#pragma omp atomic

x++ // or x--, --x, ++x

明显的,能够使用原子语句的前提条件是相应的语句能够转化成一条机器指令,使得相应的功能能够一次执行完毕而不会被打断。下面是在C/C++语言中可用的原子操作。

“+ * - / & ^ | << >>”

值得注意的是,当对一个数据进行原子操作保护的时候,就不能对数据进行临界区的保护,OpenMP运行时并不能在这两种保护机制之间建立配合机制。用户在针对同一个内存单元使用原子操作的时候,需要在程序所有涉及到该变量并行赋值的部位都加入原子操作的保护。

1. int counter=0;

2. #pragma omp parallel

3. {

4. for(int i=0;i<10000;i++)

5. {

6. #pragma omp atomic //atomic operation

7. counter++;

8. }

9. }

10. printf(“counter = %d\n”, counter);

由于使用atomic语句,则避免了可能出现的数据访问竞争情况,最后的执行结果都是一致的,执行结果总是为下面的数值(假设有两个并发线程):

counter=20000

而将atomic这一行语句从源程序中删除时,由于有了数据访问的竞争情况,所以最后的执行结果是不确定的。下面是一个可能的执行结果:

counter=12014

该结果因数据竞争而出错。

barrier同步路障

路障(barrier)是OpenMP线程的一种同步方法。线程遇到路障时必须等待,直到并行区域内的所有线程都到达了同一点,才能继续执行下面的代码。在每一个并行域和任务分担域的结束处都会有一个隐含的同步路障,执行此并行域/任务分担域的线程组在执行完毕本区域代码之前,都需要同步并行域的所有线程。也就是说在parallel、for、sections和single构造的最后,会有一个隐式的路障。

在有些情况下,隐含的同步路障并不能提供有效的同步措施。这时,需要程序员插入明确的同步路障语句#pragma omp barrier。此时,在并行区域的执行过程中,所有的执行线程都会在同步路障语句上进行同步。

1. #pragma omp parallel

2. {

3. Initialization();

4. #pragma omp barrier

5. Process();

6. }

上述例子中,只有等所有的线程都完成Initialization()初始化操作以后,才能够进行下一步的处理动作,因此,在此处插入一个明确的同步路障操作以实现线程之间的同步。

nowait

为了避免在循环过程中不必要的同步路障并加快运行速度,可以使用nowait子句除去这个隐式的

路障。如下范例所示:

1. #include .

2. int main()

3. {

4. int i,j;

5. #pragma omp parallel num_threads(4)

6. {

7. #pragma omp for nowait

8. for (i = 0; i < 8; ++i)

9. { printf("+\n"); }

10. #pragma omp for

11. for (j = 0; j < 8; ++j)

12. { printf(" -\n"); }

13. }

14. return 0;

15. }

执行结果如下:

+

+

+

+

+

+

+

+

-

-

-

-

-

-

-

-

也就是说第一个for循环结束后,后一个for循环才开始。但是使用了nowait之后则出现以下结果:+

+

-

-

+

+

-

-

+

+

-

-

+

+

-

-

此时线程在完成第一个for循环子任务后,并不需要同步等待,而是直接执行后面的任务,因此出现“-”在“+”前面的情况。

master主线程执行

用于指定一段代码由主线程执行。master制导指令和single制导指令类似,区别在于,master制导指令包含的代码段只由主线程执行,而single制导指令包含的代码段可由任一线程执行,并且master制导指令在结束处没有隐式同步,也不能指定nowait从句。语句格式如下:

#pragma omp master

下面是一个计算0~4的平方数的程序:

1. #include

2. #include

3. int main( )

4. {

5. int a[5], i;

6. #pragma omp parallel

7. {

8. #pragma omp for

9. for (i = 0; i < 5; i++)

10. a[i] = i * i;

11. #pragma omp master

12. for (i = 0; i < 5; i++)

13. printf_s("a[%d] = %d\n", i, a[i]);

14. }

15. }

输入结果为:

a[0] = 0

a[1] = 1

a[2] = 4

a[3] = 9

a[4] = 16

虽然上面的打印语句是在parallel并行域中,但是并没有被多个线程所执行,而是只有一个线程将逐个元素打印出来。

ordered顺序制导指令

对于循环代码的任务分担中,某些代码的执行需要按规定的顺序执行。典型的情况如下:在一次循环的过程中大部分的工作是可以并行执行的,而特定部分代码的工作需要等到前面的工作全部完成之后才能够执行。这时,可以使用ordered子句使特定的代码按照串行循环的次序来执行。下面例子说明ordered子句是如何对结果产生影响的。

1. #include

2. #include

3. int main( )

4. {

5. int i;

6. #pragma omp parallel

7. {

8. test(1, 8);

9. #pragma omp for ordered

10. for (i = 0; i < 5; i++)

11. printf_s("iteration %d\n", iter);

12. }

13. }

打印结果如下:

iteration 0

iteration 1

iteration 2

iteration 3

iteration 4

从结果可以看出,虽然在ordered子句之前的工作是并行执行的,但是在遇到ordered子句的时候,只有前面的循环都执行完毕之后,才能够进行下一步执行。上面的例子中将所有循环迭代都串行化了,实际上可以只将关键部分串行化,其代码框架如下:

14. #pragma omp parallel

OpenMP API 用户指南

OpenMP API 用户指南 Sun? Studio 11 Sun Microsystems, Inc. https://www.doczj.com/doc/7b223970.html, 文件号码 819-4818-10 2005 年 11 月,修订版 A 请将关于本文档的意见和建议提交至:https://www.doczj.com/doc/7b223970.html,/hwdocs/feedback

版权所有 ? 2005 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, California 95054, U.S.A. 保留所有权利。 美国政府权利-商业用途。政府用户应遵循 Sun Microsystems, Inc. 的标准许可协议,以及 FAR(Federal Acquisition Regulations,即“联邦政府采购法规”)的适用条款及其补充条款。必须依据许可证条款使用。 本发行版可能包含由第三方开发的内容。 本产品的某些部分可能是从 Berkeley BSD 系统衍生出来的,并获得了加利福尼亚大学的许可。UNIX 是 X/Open Company, Ltd. 在美国和其他国家/地区独家许可的注册商标。 Sun、Sun Microsystems、Sun 徽标、Java 和 JavaHelp 是 Sun Microsystems, Inc. 在美国和其他国家/地区的商标或注册商标。所有的 SPARC 商标的使用均已获得许可,它们是 SPARC International, Inc. 在美国和其他国家/地区的商标或注册商标。标有 SPARC 商标的产品均基于由 Sun Microsystems, Inc. 开发的体系结构。 本服务手册所介绍的产品以及所包含的信息受美国出口控制法制约,并应遵守其他国家/地区的进出口法律。严禁将本产品直接或间接地用于核设施、导弹、生化武器或海上核设施,也不能直接或间接地出口给核设施、导弹、生化武器或海上核设施的最终用户。严禁出口或转口到美国禁运的国家/地区以及美国禁止出口清单中所包含的实体,包括但不限于被禁止的个人以及特别指定的国家/地区的公民。 本文档按“原样”提供,对于所有明示或默示的条件、陈述和担保,包括对适销性、适用性或非侵权性的默示保证,均不承担任何责任,除非此免责声明的适用范围在法律上无效。

关公简介

关氏发源安邑家世光彩荣耀这个备受敬仰的姓氏,家世源流也光彩荣耀无比。他们的始祖,就是夏朝末年那位可敬的大臣关龙逢。这一点在《姓源》一书上记载得清清楚楚,是这样的:“夏臣关龙逢之后,望出陇西,东海。” 目录 基本信息 介绍 编辑本段外貌特征 1家庭成员祖父 1生父 1妻子 1子女 1孙 1身世之谜 展开 编辑本段基本信息 九澧《关氏宗谱》实乃荆州关氏宗谱也。荆州之有关氏,要从关公算起。关公长期驻守荆州,与其子关平一起遇难之后,关平之子,关公之孙关樾因其祖、父均葬于荆州之当阳,故特地留下守坟而没有回山西解州老家。关樾40代孙关琪生四子:长子关鸾、次子关福住荆州当阳,三子关德住江陵龙湾,四子关质住潜江。关质七代孙关珏生三子:长子关文汉留潜江,次子关文亨,三子关文珠迁湖南澧县。三国时,荆州辖南阳、南郡、江夏、零陵、桂阳、武陵、长沙八郡、相当于今天之湖北、湖南全省和河南、贵州两省的一部分地区。后来荆州成为府和郡。总之,当阳、江陵、潜江都是荆州所辖之地。故其始祖文亨、文珠均是荆州人。修关氏族谱者也都众口一词:澧之关氏来自荆州。《关氏创修家乘源流序》云:“缅我支始祖文珠、文亨二公,汉少将军平公四十八世孙也。明末同由荆州来澧落叶。”《关氏迁澧及创修族谱源流序》云:“平公支下四十八世孙文珠、文亨两公由荆州来澧”。再从时间来看,从三国至民国修谱其间1700年,关樾后人一直住荆州而文珠、文亨从荆州迁澧不过300多年。以代而论,从关公至文珠,文亨计48代,而从文珠、文亨迁澧不过八九代而已。总而言之,九澧之关氏始祖都是荆州人。从所创修之《关氏宗谱》看,从始祖文珠、文亨起,前面48代的内容都是照抄道光九年关楚先所携至澧之荆谱,简言之现存第二卷全部和第三卷之《汉夫子以下实录》均系照抄于荆谱。而上述这些内容又是谱的关键部分。没有这些内容就称不上谱。九澧之关氏明末至清道光,历时近300年,其所以不敢造谱,就是因为他们那时一直都不知道这些内容。这就是笔者以为九澧之关氏族谱实乃荆州关氏族谱的原因。换句话说,我们虽然至今未发现荆州关氏族谱,但见了九澧关氏族谱之后,也就等于看到荆州关氏族谱了,大可不必以没有发现荆州关氏族谱为憾。从研究关公文化的角度讲,更应作如是观。因为研究荆州关氏族谱的关键资

openmp并行程序设计

OpenMP并行程序设计(一) OpenMP是一个支持共享存储并行设计的库,特别适宜多核CPU上的并行程序设计。今天在双核CPU机器上试了一下OpenMP并行程序设计,发现效率方面超出想象,因此写出来分享给大家。 在VC8.0中项目的属性对话框中,左边框里的“配置属性”下的“C/C++”下的“语言”页里,将OpenMP支持改为“是/(OpenMP)”就可以支持OpenMP了。 先看一个简单的使用了OpenMP程序 int main(int argc, char* argv[]) { #pragma omp parallel for for (int i = 0; i < 10; i++ ) { printf("i = %d\n", i); } return 0; } 这个程序执行后打印出以下结果: i = 0 i = 5 i = 1 i = 6 i = 2 i = 7 i = 3 i = 8 i = 4 i = 9 可见for 循环语句中的内容被并行执行了。(每次运行的打印结果可能会有区别) 这里要说明一下,#pragma omp parallel for 这条语句是用来指定后面的for循环语句变成并行执行的,当然for循环里的内容必须满足可以并行执行,即每次循环互不相干,后一次循环不依赖于前面的循环。 有关#pragma omp parallel for 这条语句的具体含义及相关OpenMP指令和函数的介绍暂时先放一放,只要知道这条语句会将后面的for循环里的内容变成并行执行就行了。 将for循环里的语句变成并行执行后效率会不会提高呢,我想这是我们最关心的内容了。

关帝庙导游词范文介绍

关帝庙导游词范文介绍 ——WORD文档,下载后可编辑修改—— 关帝庙导游词1 欢迎大家来到这!我是你们的导游,我姓x,大家可以叫我小x。为了便于大家参观游玩,下面我首先大家介绍一下。 现在我们到了运城市西解州城外的关帝庙。关帝庙是奉祀三国时期武将关羽的寺庙,其规模宏大,气势雄伟,是我国乃至海外关帝庙中规模最大的宫殿式庙宇,也是国内现存最好、最完整的关庙建筑群之一。关帝庙南倚中条山,北濒盐池水,绿树成荫,景色秀丽,具湖光山色之胜,已列入全国重点文物保护单位。 我们读《三国演义》,看《三国》戏和电视剧,都知晓关羽的盛名,可谓家喻户晓。关羽(公元160卜—219年),终年59岁,字云长。传说关羽本来不姓关,因杀了欺侮良家民女的县尹被迫捕,逃至撞关,过关隘被关吏查询时。他随口指关为姓,从此以关姓闯至河北涿县。以后,与刘备、张飞结为手足兄弟。建安五年(公元200年)刘备兵败投袁绍,关羽被曹操俘虏,曹操赏识他英勇善战,拜他为偏将军。关羽斩颜良、文丑,封汉寿亭侯。随后,关羽再次投奔刘备,著名的赤壁大战,刘备和孙权联合击败曹操,关羽受命镇守要塞荆州。建安二十四年(公元224年),关羽率军攻樊城,水淹七军,活捉曹操大将于禁,斩名将庞德,威震华夏。不料孙权乘机派兵从背后偷袭,关羽败走麦城被杀。关羽战功显赫,名声跃居历代名将之上,后被迫封为“壮缪侯”。民间百姓追慕关羽忠孝义勇,逐渐奉若神明。历代统治者利

用关羽对君主忠贞不二的品格,大肆宣染和教化,逐渐封王、封帝。明清时代,关羽有“武王”、“武圣人”之尊,与“文王”、“文圣人”孔子并肩而立。 我们面前这座气势宏伟的建筑就是关帝庙,首先由我介绍一下庙宇的历史和布局。据文献记载,解州关帝庙创建于隋初(公元589年),宋代大中祥符七年(公元1014年)扩建。明嘉靖三十四年(公元1555年),毁于地震,再建后又于康熙四十一年(公元1702年)毁于大火,乾隆十八年(公元1753年)又予重修,历经数十年修缮,始恢复旧貌。现在的庙院南北长700余米,东西宽200余米,总面积14万平方米,各种房屋200余间,规模巨大,建筑精美,气势恢弘,为中国武庙之最,颇具王宫气派。整个庙宇的布局分南北两大部分,南为结义园,北为正庙。正庙又分前后两院,前为庙堂,后为寝宫,形成了我国传统的“前朝后寝”的格局。 各位女士、先生,我们现在站在关帝庙东侧的大门,从这里直入的是北部的正庙部分,进人之前让我们参观一下南侧的结义园。当年刘备、关羽、张飞三兄弟在桃园结义,现在结义园的景致是依照当时的场景进行设计建造,由木牌坊、君子亭、三义阁、假山、莲池等建筑组成。每逢春暖花开之际,四周桃花含苞欲放,阵阵花香袭人,颇富桃园结义诣趣。 现在我们出结义园,进入主庙。大家脚下的这条路是主庙的中轴线,在这条主线上自南而北依次排列着端门、雉门、午门、御书楼、祟宁殿,两侧配以木坊、石坊、钟鼓楼、祟圣祠、胡公祠、追风伯祠、碑

openMP实验总结报告

openMP实验报告 目录 openMP实验报告.............................................. 错误!未定义书签。 OpenMP简介.............................................. 错误!未定义书签。 实验一................................................... 错误!未定义书签。 实验二................................................... 错误!未定义书签。 实验三................................................... 错误!未定义书签。 实验四................................................... 错误!未定义书签。 实验五................................................... 错误!未定义书签。 实验六................................................... 错误!未定义书签。 实验七................................................... 错误!未定义书签。 实验八................................................... 错误!未定义书签。 实验总结................................................. 错误!未定义书签。 在学习了MPI之后,我们又继续学习了有关openMP的并行运算,通过老师的细致讲解,我们对openMP有了一个初步的了解: OpenMP简介 OpenMP是一种用于共享内存并行系统的多线程程序设计的库(Compiler Directive),特别适合于多核CPU上的并行程序开发设计。它支持的语言包括:C 语言、C++、Fortran;不过,用以上这些语言进行程序开发时,并非需要特别关注的地方,因为现如今的大多数编译器已经支持了OpenMP,例如:Sun Compiler,GNU Compiler、Intel Compiler、Visual Studio等等。程序员在编程时,只需要在特定的源代码片段的前面加入OpenMP专用的#pargma omp预编译指令,就可以“通知”编译器将该段程序自动进行并行化处理,并且在必要的时候加入线程同步及通信机制。当编译器选择忽略#pargma omp预处理指令时,或者编译器不支持OpenMP时,程序又退化为一般的通用串行程序,此时,代码

2020年最新解州关帝庙_1

( 山西导游词) 姓名:____________________ 单位:____________________ 日期:____________________ 编号:YB-BH-012142 2020年最新解州关帝庙The latest Jiezhou Guandi temple in 2020

2020年最新解州关帝庙 解州古称解梁,是三国蜀汉名将关羽的故乡,位于运城市西南15公里的解州镇,镇西有全国现存最大的关帝庙,俗称解州关帝庙,系全国重点文物保护单位。 解州关帝庙创建于隋开皇九年(589),宋朝大中祥符七年(1014)重建,嗣后屡建屡毁,现存建筑为清康熙四十一年(1072)大火之后,历时十载而重建的。庙以东西向街道为界,分南北两大部分,总占地面积约66600余平方米。街南称结义园,由结义坊、君子亭、三义阁、莲花池、假山等建筑组成。残存高2米的结义碑1通,白描阴刻人物,桃花吐艳,竹枝扶疏,构思奇巧,刻技颇高,系清乾隆二十八年(1763)言如泗主持刻建的。园内桃林繁茂,千枝万朵,颇有“三结义”的桃园风趣。街北是正庙,座北朝南,仿宫殿式布局,占地面积18570平方米,横线上分中、东、西三院,中院是主体,主轴线上又分前院和后宫两部分。前院依次是照壁、端门、雉门、午门、山海钟灵坊、御书楼和崇宁殿。两侧是钟鼓楼、“大义参天”坊、“精忠贯日”坊、追风伯祠。后宫以“气肃千秋”坊、春秋楼为中心,左右有刀楼、印楼对称而立。东院有崇圣祠、三清殿、祝公祠、葆元宫、飨圣宫和东花园。西院有长寿宫、永寿宫、余庆宫、歆圣宫、道正司、汇善司和西花园以及前庭的“万代瞻仰”坊、“威震华夏”坊。全庙共

红色景点集合简介

中国人民抗日战争纪念馆位于丰台区宛平城城内街,属社会科学类专题历史纪念馆,为纪念中国人民伟大的抗日战争而建。于1987年7月6日对外开放。其二期工程也于1997年抗战60周年前夕建成并开放。纪念馆位于宛平城中心,距卢沟桥500米,是一座具有民族特色的建筑。 西柏坡纪念馆位于山西省文水县城东17公里的云周西村,距太原市区85公里。建于1956年,后于1957、1976年两次扩建。馆舍坐北向南。馆前广场的汉白玉石纪念碑上刻着毛泽东同志的亲笔题词:“生的伟大,死的光荣”。烈士墓前耸立着汉白玉烈士石雕像。馆内还有烈士生平事迹陈列室、烈士被捕处、斥敌处、就义处等,是进行革命传统教育的现实教材。 1948年5月,中共中央、中国人民解放军总部进驻,这个山村成为中国共产党领导全国人民和解放军与国民党进行战略大决战,创建新中国的指挥中心;1949年3月23日,中共中央、中央军委和中国人民解放军总部从西柏坡迁入北平。西柏坡主要建设有西柏坡纪念馆,是全国著名革命纪念地和中宣部命名的全国百个爱国主义教育示范基地. 九·一八历史博物馆位于辽宁省沈阳市大东区望花南街,该馆是为警示后人勿忘“九一八”国耻而修建。博物馆建成于1991年,主体建筑采用碑馆结合形式。残历碑是一座巨大石雕,碑形为翻到事变日期的台历,上面布满弹痕与骷髅。馆内以丰富的史料向人们介绍了日本帝国主义发动“九一八”事变、奴役中国人民的罪行和沦陷区人民的苦难生活及不屈不挠的斗争事迹。 沈阳抗美援朝烈士陵园建于1951年初,占地24万平米,由烈士纪念碑、烈士墓群、烈士纪念馆、录像厅等设施组成。地处陵园最高点的纪念碑主体高23米,是烈士陵园的标志性建筑;纪念碑后松林中安葬着特级战斗英雄黄继光、杨根思、一级战斗英雄邱少云、孙占元、杨连第及各级英雄模范的志愿军烈士123位。沈阳抗美援烈士陵园始终受到党和国家的亲切关怀和大力支持。刚建园时,国家副主席董必武同志为纪念碑题字:“抗美援朝烈士英灵永垂不朽”;周恩来总理亲自审定了471字的纪念碑碑文,郭沫若同志为陵园题写园名并赋诗颂扬烈士的爱国主义和国际主义精神,烈士所在部队的首长为烈士们撰写了碑文中国共产党第一次全国代表大会会址纪念馆(现上海市兴业路76号,原望志路106号)是介绍中国共产党诞生史迹的革命旧址纪念馆。建于1952年,由“一大”会议室、中共创建史陈列室和革命史专题临时陈列室3部分组成。“一大”会议室位于兴业路76号底楼,家具与物品均按当年原样陈列。中共创建陈列室有历史文献、文物和照片170余件,陈列内容为中国共产党成立的历史背景、各地共产主义小组的产生及其活动、中国共产党的诞生。革命史专题临时陈列室曾分别举办过毛泽东、周恩来在上海的史料展览。 中共代表团梅园新村纪念馆,位于江苏省南京市城东长江路东端的梅园新村街道两侧,由中共代表团办事处旧址、国共南京谈判史料陈列馆、周恩来铜像、周恩来图书馆等组成,属于近现代历史遗迹及革命纪念建筑物。1946年5月至1947年3月,以周恩来为首的中国共产党代表团,在这里同国民党政府进行了10个月零4天的谈判 雨花台烈士陵园位于南京市雨花台区雨花台丘陵中岗,是新中国规模最大的纪念性陵园,国家首批4A级旅游区,全国重点文物保护单位,全国爱国主义教育示范基地,面积113公顷。陵园包括雨花台主峰等5个山岗,以主峰为中心形成南北向中轴线,自南向北有南大门、广场、纪念馆、纪念桥、革命烈士纪念碑、北殉难处烈士大型雕像、北大门以及西殉难处烈士墓群、东殉难处烈士,纪念亭等。 侵华日军南京大屠杀遇难同胞纪念馆是中国南京市人民政府为铭记1937年12月13日日军攻占南京后制造的南京大屠杀事件而筹建。位于中国南京城西江东门茶亭东街原日军大屠杀遗址之一的万人坑。1985年8月15日落

解州关帝庙

解州关帝庙 解州古称解梁,是三国蜀汉名将关羽的故乡,位于运都市西南15公里的解州镇,镇西有全国现存最大的关帝庙,俗称解州关帝庙,系全国重点文物爱护单位。 游人从义勇门或忠武门入前庭,穿过“文官下轿,武官下马”的端门,东西钟鼓楼巍巍耸立,迎面三座高大的单檐歇山顶庙门,中门是专供帝王进出的门,叫“雉门”,东面的“文经门”是文职官员行走的,西侧的是“武纬门”,是甲胄之士通行的。雉门门楼上嵌竖匾,书金字“关帝庙”三字。雉门后部的台阶上是戏台,铺上台板即可演戏,是一座双昂卷棚歇山顶建造,下是横匾“全部春秋”,与上、下场门的“演古”、“证今”相映成趣。 前行有午门.是一座面阔五间,单檐庑殿顶、石雕回廊的厅式建造。身边有石栏杆,栏板正反两面浮雕各类图案、人物144幅,洋洋大观,颇有童趣。厅内南有周仓、廖化画像,轩昂威武。北面左右两侧,彩绘着关羽戎马一生的要紧记忆,起于桃园三结义,止于水淹七军,不过没有走麦城那个情节,在全国关庙壁画中都按此进行,据说这是因忌讳关羽自高自大而被杀,终于造成蜀国的覆灭而隐去的。穿过午门,经“山海钟灵”坊、御书楼,便是关帝庙主体建造崇宁殿。 穿崇宁殿而出,入后宫南门,就进入寝宫,过花圃,有“气肃千秋”坊,是中轴线上最高大的木牌坊。东侧有印楼,里边放着“汉寿亭侯”玉印模型,西侧是刀楼,里面列青龙偃月刀模型。双楼对峙,系方形三层的十字歇山顶建造。院里植有翠竹一片,风动影摇,珊珊可爱。又有《汉夫子风雨竹》碑刻,以竹隐诗,诗曰“莫嫌孤叶淡,经久别凋零。多谢东君意,丹青独留名”。传说出自关羽的手笔。 后宫后部,是关帝庙扛鼎之作的春秋楼,掩映在参天古树和名花异卉之间,巍然屹立,大气磅礴。楼内有关羽读《春秋》像,故名。《春秋》又名《麟经》,故又名麟经阁。创建于明万历年间,现存建造为清同治九年(187o)重修的。宽七间,进深六间,二层三檐歇山式建造,高33米。上下两层皆施回廊,四周勾栏相依,可供凭栏远眺。檐下木雕龙凤、流云、花卉、人物、走兽等图案,雕工精湛,剔透有致。楼顶彩色琉璃覆盖,光泽夺目。楼内东西两侧,各有楼梯36级,可供上下。第一层上,有木制隔扇108面,图案古朴,工艺神奇,传说是象征历史上山西108个县。世传春秋楼有三绝:建造结构奇巧别致,上层回廊的廊柱,矗立在下层垂莲柱上,垂柱悬空,内设搭牵挑承,给人以悬空之感谓之一绝;进入二层楼,有神龛暖阁,正中有关羽侧身夜观《春秋》像,阁子板壁上,正楷刻写着全部《春秋》,谓之二绝;据说楼当项,正好对着北斗七星的位置,谓之三绝。 北武当山导游词·山西导游词·观音堂导游词·晋祠导游词·广胜寺导游词 关帝庙除古建造外,还有琉璃影壁、石头牌坊、万斤铜钟、铁铸香炉、石雕饰品、木刻器具以及各代石刻23块,各朝题诗题匾60余幅,还有其他的零散文物,基本上值得一观的艺术精品。 共2页,当前第1页12

openMP学习笔记分析

1、OpenMP指令和库函数介绍 下面来介绍OpenMP的基本指令和常用指令的用法, 在C/C++中,OpenMP指令使用的格式为 #pragma omp 指令 [子句[子句]…] 前面提到的parallel for就是一条指令,有些书中也将OpenMP的“指令”叫做“编译指导语句”,后面的子句是可选的。例如: #pragma omp parallel private(i, j) parallel 就是指令,private是子句 为叙述方便把包含#pragma和OpenMP指令的一行叫做语句,如上面那行叫parallel语句。 OpenMP的指令有以下一些: parallel,用在一个代码段之前,表示这段代码将被多个线程并行执行 for,用于for循环之前,将循环分配到多个线程中并行执行,必须保证每次循环之间无相关性。 parallel for,parallel 和for语句的结合,也是用在一个for循环之前,表示for循环的代码将被多个线程并行执行。 sections,用在可能会被并行执行的代码段之前 parallel sections,parallel和sections两个语句的结合 critical,用在一段代码临界区之前 single,用在一段只被单个线程执行的代码段之前,表示后面的代码段将被单线程执行。 flush, barrier,用于并行区内代码的线程同步,所有线程执行到barrier时要停止,直到所有线程都执行到barrier时才继续往下执行。 atomic,用于指定一块内存区域被制动更新 master,用于指定一段代码块由主线程执行 ordered,用于指定并行区域的循环按顺序执行 threadprivate, 用于指定一个变量是线程私有的。 OpenMP除上述指令外,还有一些库函数,下面列出几个常用的库函数:omp_get_num_procs, 返回运行本线程的多处理机的处理器个数。 omp_get_num_threads, 返回当前并行区域中的活动线程个数。 omp_get_thread_num, 返回线程号 omp_set_num_threads, 设置并行执行代码时的线程个数 omp_init_lock, 初始化一个简单锁 omp_set_lock,上锁操作 omp_unset_lock,解锁操作,要和omp_set_lock函数配对使用。 omp_destroy_lock,omp_init_lock函数的配对操作函数,关闭一个锁 OpenMP的子句有以下一些 private, 指定每个线程都有它自己的变量私有副本。 firstprivate,指定每个线程都有它自己的变量私有副本,并且变量要被继承主线程中的初值。lastprivate,主要是用来指定将线程中的私有变量的值在并行处理结束后复制回主线程中的对应变量。 reduce,用来指定一个或多个变量是私有的,并且在并行处理结束后这些变量要执行指定的运算。

大庙诸殿诸神简介

下双寨大庙殿宇诸神简介 一、大殿(关帝殿) 下双寨大庙原为关帝庙,所以大殿也就是关帝殿。殿内有塑像,面南背北。有二从祀,左为周仓,手持青龙偃月刀,右有关平,一手按剑。大殿往北有倒坐观音像,略小于关羽像,也有二从祀,左有牛王,右为马祖。 关帝君俗称关公、圣帝君、伏魔大帝等,既属于佛教又属于道教,又是集民间信仰三者于一身的神,甚至儒家学者也极力推崇其?忠义?的精神。而此神又是从人格转化成为神格,可真是称得上中国宗教发展史上最令人注目的例子。 关公,字云长,所以又名关云长。汉朝末年天下大乱,曹操携天子以令諸侯,刘邦志在中兴汉室,与关羽、張飞桃园三结义,情若手足,后世人受其义气感召,凡是结拜兄弟必须到关帝庙宣誓乃由此而起,其中关羽至死不背叛其结义兄弟,更是后人的表率。晋朝时佛教为了在中国生根和本土化,先假托关公显灵,把关羽封为伽蓝护法之神,到了东汉道教兴起,直到宋徽宗的笃信道教,于崇宁二年,道教第三十代天师,道士张继上书朝廷,说可让关羽在殿内显灵,后來民间就称关羽为?崇宁真君?,这是关羽成为道教神祇的开始。 道教传说关羽是龙转世,所以能救旱。相传五月十三日是关羽磨刀日,磨刀水滴下人间能解旱,所以有?大旱不过五月十三?的俗谚。明朝万历年初,传说关羽聖君显灵,阻止一场瘟疫,所以他还能除瘟保佑万民。关羽之所以受到商人的推崇,开始于清朝初期的康熙晚年,据说当时的人考证

是他发明了今天通行的簿记法,能够把账目记得一清二楚,所以被商人推举成为代表商的神祇。随着关羽地位变得显赫,关羽更被尊称为?武王?、?武圣人?,与孔子并肩而立。也正因为关羽如此显赫,除了军人、武师奉他为行业神崇拜外,就连描金业、烟业、香烛业、教育业、命相家等等不相干的行业也推崇关羽,所以也将他变成武财神,又是五文昌之一。 在中国关庙的数量还多过孔庙,贵在是佛、道、儒三教、朝廷和民间都尊崇帝聖君的结果,甚至可以说中国内外最多的殿宇,就是关帝庙。 配祀:关羽的义子关平死于激战,后人为表彰他将他尊为从祀。另有周仓知道关羽战死的消息竟因悲痛而自杀,所以也被后人列为关羽的配祀。有些殿宇有文昌帝君、观音佛祖等多种配祀。 武财神关羽:在中国传统民间观念中,认为财神是掌管天上财富的神。而关公被中国民间奉为武财神。关羽形象威武,不但忠义感人,而且据说还能招财进宝。摆放武财神时,应面向屋外,或朝向大门。一方面可以招财进屋,同时又可镇守门户,阻挡外邪。 供奉财神关羽: 必须面对大门屋外,既可招财,又可镇宅保平安 供奉随心,一般供养都是在初一和十五,其他日子里自己要是想到去供奉更好,没有必须要求 供奉财神关羽的注意事项 供品的话,最好不要有酒。财神关羽三弟,张飞就因为贪杯误事,所以关羽成神之后不喝酒。

关帝庙讲解词1

关帝庙 讲解重点 1、概况(武庙之祖、位置、规模、羽历史地位、关公文化 2、崇宁殿石柱匾额 3、春秋楼三绝对联 各位游客,大家好!今天我将带领大家去领略一下武庙之冠——关帝庙的风采。 关帝庙是专门祭奉关羽的庙堂。说起关羽,可谓家喻户晓,妇孺皆知,据说他本不姓关,只因为激于义愤杀了当地恶霸,不得已逃往他乡,过潼关时,见自己的画像被贴在城门口无法过关,情急之下,打破鼻子,以血染面,指关为姓,才得以逃脱,而有了后来千古流芳的“桃园三结义”。关羽一生甘胆忠义,战功显赫,不仅受历代统治阶级的供奉,而且在民间也深受老百姓的尊崇。他不仅成为忠义神勇的代表,而且成为驱邪镇恶,去病消灾,保护行旅商贾,招财进宝的象征。所以关帝庙遍布神州,而关羽也受到了儒释道三教的顶礼膜拜。关帝庙除官府修建外,更多的是民间自建。在我国数不胜数的关帝庙中,有三座被称为中国三大关帝建筑,它们是河南洛阳的关林,湖北当阳的关帝庙和山西运城的关帝庙,而其中规模最大、气势最宏伟的关帝庙,当数山西运城解州的这座关帝庙,人称“天下第一关帝庙”,被誉为“关庙之祖”。它与山东曲阜孔子家乡的孔庙,一文一武遥相呼应,构成传统文化文武崇拜的两脉之源。 我们面前的这座关帝庙修建于隋朝,现存建筑为清朝重修,整座庙宇占地面积达14万平方米,规模巨大,气势恢宏。其建筑规格很高,完全是仿照帝王宫廷,前朝后寝的模式修建的,它呈中轴对称结构,仅大门就设了三重,端门、雉门、午门全部套用古代王宫大门的名称,体现出解州关帝庙的独特地位。

听完上面的介绍,想必大家一定对武圣及其庙宇有了一个整体认识,接下来让我们去细细欣赏一下。 大家请看,现在呈现在我们面前的这座恢宏的建筑,就是进入主庙的第一道大门——端门,门楣正中刻着“关帝庙”三个刚劲有力的镏金大字。我们再看门对面的这一琉璃影壁,上有四条蟠龙,我国龙壁一般为九条蟠龙,而这里只有四条,是因为关羽死后才被封帝,“四”与“死”谐音,暗喻关羽不同于一般的真龙天子。门前空地上立着的这三根交叉铁柱俗称“门挡”也叫“挡众”,它提醒人们,到此文官落轿,武官下马,体现了圣庙的威严与尊崇。 穿过“文官下轿,武官下马”的端门,我们便来到了雉门,雉门是专供帝王出入的,它的两侧有文经门和武纬门,文官从东侧文经门通过,武官则从西侧武纬门进入。雉门不仅有门的作用,而且同时还是过路戏台,每逢庙会,就会在这里唱戏,尤其是关公戏更是常演不衰,使人们在观戏娱乐之余,以古鉴今,遐思绵绵,真可谓“舞台小天地,天地大舞台”。 出了雉门再往前行,我们便来到了午门。午门是庙内修建年代最晚的建筑,它虽称门,但却是一条宽敞无阻的大过道,登上午门,大家请看,正面墙上的壁画描述的是关羽的部将周仓、廖化的故事,以及儒释道三教文化在关羽身上融合的故事,大家可以仔细欣赏。 沿着午门大道,穿过雕造华美的“山海钟灵”木牌坊,我们看到的这座壮观精美的建筑物就是御书楼了。御书楼原名八卦楼,因为楼顶有一木构的八卦图案而得名。清代乾隆时为纪念康熙御笔亲书的“义炳乾坤”金匾而改称“御书楼”。大家请往上看,上方的这一巨匾中所书的“绝伦逸群”是武侯诸葛亮对关羽的评语,流畅洒脱,运笔自然。 正庙中最富丽堂皇、气势宏伟的建筑,当数主殿崇宁殿,请大家随我来看一下。众所周知关羽一生忠贞护主,深得后人敬仰,所以宋徽宗追封他为“崇宁真君”,并敕建此殿。大殿最引人注目的是环绕殿宇四周的26根巨大石柱,石柱上的雕龙粗犷有力,与柱头额枋上的精雕细刻互相烘托,各具神韵,其数量之多,在国内宫殿庙宇中堪称一绝,殿檐下的“神

并行计算环境介绍

并行计算环境介绍 计算机系04 级研究生 武志鹏 1 MPI简介 目前两种最重要的并行编程模型是数据并行和消息传递。 数据并 行编程模型的编程级别比较高,编程相对简单,但它仅适用于数据并 行问题;消息传递编程模型的编程级别相对较低,但消息传递编程模 型可以有更广泛的应用范围。 MPI就是一种消息传递编程模型,并成为这种编程模型的代表和 事实上的标准。 1.1什么是 MPI 对MPI的定义是多种多样的,但不外乎下面三个方面: (1) MPI是一个库,而不是一门语言; (2) MPI是一种标准或规范的代表,而不特指某一个对它的实现; (3) MPI是一种消息传递编程模型,MPI虽然很庞大,但是它的最 终目的是服务于进程间通信这一目标的。 1.2 MPI的历史 MPI的标准化开始于1992年4月在威吉尼亚的威廉姆斯堡召开的分 布存储环境中消息传递标准的讨论会,由Dongarra,Hempel,Hey和 Walker建议的初始草案,于1992年11月推出并在1993年2月完成了修

订版,这就是MPI 1.0。 1995年6月推出了MPI的新版本MPI1.1,对原来的MPI作了进一步 的修改完善和扩充。 在1997年7月在对原来的MPI作了重大扩充的基础上又推出了MPI 的扩充部分MPI-2,而把原来的MPI各种版本称为MPI-1。 MPI-2的扩 充很多但主要是三个方面:并行I/O、远程存储访问和动态进程管理。 1.3 MPI的语言绑定 在MPI-1中明确提出了MPI和FORTRAN 77与C语言的绑定,并且 给出了通用接口和针对FORTRAN 77与C的专用接口说明。在MPI-2 中除了和原来的FORTRAN 77和C语言实现绑定之外,进一步与 Fortran90和C++结合起来。 1.4 MPI的实现版本 MPICH是一种最重要的MPI实现, 它是与MPI-1规范同步发展的版 本,每当MPI推出新的版本,就会有相应的MPICH的实现版本,另外 它还支持部分MPI-2的特征。 LAM-MPI也是一种MPI实现, 主要用于异构的计算机网络计算系统。 以上2种版本的MPI实现可以分别从以下网址下载: MPICH(最新版本1.2.7): https://www.doczj.com/doc/7b223970.html,/mpi/mpich/ LAM-MPI(最新版本7.1.2):

运城介绍

14110平方公里 是山西省占地面积最大的 运城位于山西省西南端,总面积14236.5平方公里。黄河中游北干流以东,与河南,陕西隔河相望,北靠临汾,东邻晋东南。古称“河东”,河东大地外滨澎湃的黄河,内有绵延的中条山,自古就有“表里山河”的美誉,历史悠久,源远流长,是中华民族最早的发祥地之一。早在180万年以前,我们的祖先就已经在这里生息繁衍。历史上,这里曾是舜、禹建都的地方,舜都蒲板,禹都安邑即今永济市,后稷教民稼穑于稷山,嫘祖教民养蚕于夏县,可谓文化源远流长,且光辉灿烂。 运城地区现辖运城市、永济市、河津市及闻喜、绎县、垣曲、夏县、平陆、新绛、稷山、万荣、临猗、芮城等县。总面积13968平方公里,总人口425万。中共运城地委、行署设在运城市。 就中国成立以后,运城地区的社会经济貌发生了巨大变化,现已形成以纺织,造纸,化工,食品,冶金,建材,机械为支柱产业的门类较齐全的国经济体系,成为我省重要的朴棉生产基地。 运城境内水资源比较年富.黄河、汾河、涑水河流经境内,境内总流长6对公里、境内平川占到总面积的58.3%。该区地理座标介于北纬34°35′─35°41′,东经110°15′─112°04′之间,属暖温带半干旱大陆性季风气候。其基本特征是,气候温和,冬寒夏暖,热量资源充足,夏秋雨水丰沛,光能,风能较丰富。是山西省积温较高的地区。 运城地区历史悠久,山川壮丽,文物古迹星罗棋布,风光名胜遍布各地,旅游资源十分丰富。境内有历山,孤峰山,吕梁山,五老山,尤门天险,王官峪瀑布,闫家池峪谷瀑布和温泉等自然景观;有著名流口大禹渡,津渡和风陵渡。有闻名华夏的古文化遗址和古建筑,如:南海峪岩洞遗址,西候渡遗址,禹王城遗址,司马光祖墓,晋文墓,晋南云墓,关帝庙,永乐官,普救寺,飞云楼等。这些自然景观和古文化具有极高的观赏,游览价值和艺术欣赏价值。河东先后培育出商代中兴贤相傅说,春秋霸主晋文公,战国纵横家张仪,蜀汉名将关羽,晋代文学家郭璞,隋代哲学家、教育家王通,唐文学家王勃、柳宗元、唐代名相裴度、名将薛仁贵、宋代名相、史学家司马光等等。

山西关帝庙导游词精选5篇

山西关帝庙导游词精选5篇 解州关帝庙(hài zhōu guān dì miào)为武庙之祖,地处山西运城市解州镇西关。北靠盐池,面对中条。解州关帝庙创建于隋开皇九年(589年),宋、明时曾扩建和重修,清康熙四十一年(1720___年)毁于火,经十余年始修复。以下是为大家整理的山西关帝庙导游词精选5篇,供大家参考学习。 山西关帝庙导游词1 现在我们到了运城市西解州城外的关帝庙。关帝庙是奉祀三国时期武将关羽的寺庙,其规模宏大,气势雄伟,是我国乃至海外关帝庙中规模最大的宫殿式庙宇,也是国内现存最好、最完整的关庙建筑群之一。关帝庙南倚中条山,北濒盐池水,绿树成荫,景色秀丽,具湖光山色之胜,已列入全国重点文物保护单位。 我们读《三国演义》,看《三国》戏和电视剧,都知晓关羽的盛名,可谓家喻户晓。关羽(公元160卜—220___年),终年59岁,字云长。传说关羽本来不姓关,因杀了欺侮良家民女的县尹被迫捕,逃至撞关,过关隘被关吏查询时。他随口指关为姓,从此以关姓闯至河北涿县。以后,与刘备、张飞结为手足兄弟。建安五年(公元220___年)刘备兵败投袁绍,关羽被曹操俘虏,曹操赏识他英勇善战,拜他为偏将军。关羽斩颜良、文丑,封汉寿亭

侯。随后,关羽再次投奔刘备,著名的赤壁大战,刘备和孙权联合击败曹操,关羽受命镇守要塞荆州。建安二十四年(公元220___年),关羽率军攻樊城,水淹七军,活捉曹操大将于禁,斩名将庞德,威震华夏。不料孙权乘机派兵从背后偷袭,关羽败走麦城被杀。关羽战功显赫,名声跃居历代名将之上,后被迫封为“壮缪侯”。民间百姓追慕关羽忠孝义勇,逐渐奉若神明。历代统治者利用关羽对君主忠贞不二的品格,大肆宣染和教化,逐渐封王、封帝。明清时代,关羽有“武王”、“武圣人”之尊,与“文王”、“文圣人”孔子并肩而立。 我们面前这座气势宏伟的建筑就是关帝庙,首先由我介绍一下庙宇的历史和布局。据文献记载,解州关帝庙创建于隋初(公元589年),宋代大中祥符七年(公元1020___年)扩建。明嘉靖三十四年(公元1555年),毁于地震,再建后又于康熙四十一年(公元1720___年)毁于大火,乾隆十八年(公元1753年)又予重修,历经数十年修缮,始恢复旧貌。现在的庙院南北长700余米,东西宽200余米,总面积14万平方米,各种房屋200余间,规模巨大,建筑精美,气势恢弘,为中国武庙之最,颇具王宫气派。整个庙宇的布局分南北两大部分,南为结义园,北为正庙。正庙又分前后两院,前为庙堂,后为寝宫,形成了我国传统的“前朝后寝”的格局。

OpenMP例程使用手册

OpenMP例程使用手册 目录 1 OpenMP简介 (2) 2 OpenMP例程编译 (2) 2.1安装gawk (2) 2.2编译例程 (2) 2.3拷贝例程到开发板 (3) 3例程测试 (5) 3.1 dspheap (5) 3.2 vecadd (6) 3.3 vecadd_complex (6) 3.4 其他例程测试说明 (7) 更多帮助.................................................................................................... 错误!未定义书签。 公司官网:https://www.doczj.com/doc/7b223970.html, 销售邮箱:sales@https://www.doczj.com/doc/7b223970.html, 公司总机:020-8998-6280 1/7技术论坛:https://www.doczj.com/doc/7b223970.html, 技术邮箱:support@https://www.doczj.com/doc/7b223970.html, 技术热线:020-3893-9734

1 OpenMP简介 OpenMP用于共享内存并行系统的多处理器程序设计的一套指导性的编译处理方案(Compiler Directive)。它是为在多处理机上编写并行程序而设计的一个应用编程接口。它包括一套编译指导语句和一个用来支持它的函数库。 OpenMP提供的这种对于并行描述的高层抽象降低了并行编程的难度和复杂度,这样程序员可以把更多的精力投入到并行算法本身,而非其具体实现细节。对基于数据分集的多线程程序设计,OpenMP是一个很好的选择。同时,使用OpenMP也提供了更强的灵活性,可以较容易的适应不同的并行系统配置。线程粒度和负载平衡等是传统多线程程序设计中的难题,但在OpenMP中,OpenMP库从程序员手中接管了部分这两方面的工作。 但是,作为高层抽象,OpenMP并不适合需要复杂的线程间同步和互斥的场合。OpenMP的另一个缺点是不能在非共享内存系统(如计算机集群)上使用。在这样的系统上,MPI使用较多。 2 OpenMP例程编译 2.1安装gawk 此工具为编译的必要工具,在Ubuntu下安装: Host#sudoapt-get install gawk 图1 2.2编译例程 请先安装ti-processor-sdk-linux-am57xx-evm-03.01.00.06,安装步骤请参照《相关软件

日本主要城市及名胜简介

[转帖]日本主要城市及名胜简介 京滨地区 东京 日本首都,全国政治、经济、文化、交通中心。世界特大城市之一。在本州岛东南部,临东京湾。全称东京都,为一级行政区,辖23个特别区、26个市、七个町(镇)和八个村(包括海上的伊豆诸岛和小笠原群岛)。面积2162平方公里,人口1205.9万。其中,23个区相当于市区,面积591平方公里。夏季高温多雨,冬季寒冷干燥。年降水量约1400余毫米。 东京西部是关东山地,被称为奥多摩山区,耕地和村庄散落在河流沿岸的山坡地或者河岸丘陵地上。中部为武藏野高原(洪积高原),西北多摩、狭山两座人造湖的狭山丘陵,南面有多摩丘陵。绵延的武藏野高原末端是被称为高岗区的高原。东京湾一带是隅田川、中川、江户川以及多摩川等的三角洲,被称为低温地。这里的地盘较新(冲积层),由于过多地抽取地下水,地面下沉显著,出现了海水水位零下地区,易遭水灾。另外,伊豆诸岛处在富士火山带上,因而大岛三原山地区火山甚多。 东京旧称江户。1457年建城。1868年改称现名,1869年成为首都。1923年遭关东大地震破坏,后经重建和扩大。1943年改称东京都。 东京城市中心的街巷布局、道路以及护城河,继承了江户时代的规划。关东大地震后做了整顿,但城市计划只进行了一部分。1873年开设铁路,1903年开通了市内电车,1927年上野至浅草间的地铁通车,推动了东京的发展。随着欧洲文化的传入,1873年在银座建设了砖瓦建筑的商店街,在丸之内出现了红砖建筑办公大楼街。1923年建成的丸大楼,成了高层大楼办公街的代表,江户的古老街道逐渐变成西洋式的东京。 东京的现代化起始应归功于1964年举办的东京奥运会,同年由于开通新干线和高速公路,人口开始向东京集中。现在的东京高层建筑林立,而地下还分布有四通八达的15条线路的地下铁路网。 江户时代东京的人口最高达130万,成为世界第一大城市,但明治维新后的一个时期人口曾减到180万。关东大地震后减到152万,1932年因合并郊区街村,人口增至513万,增长很显著。现在是世界人口最多的城市。 东京是全国最大的经济中心,60%的大公司和1/3的银行集中于此。第三产业约占整个产业的68%。是全国最大的制造业中心。以印刷出版、电子、电机、运输机械、食品和精密机械为主,均居全国首位。海港进出口总值亦居全国前列。有羽田国际机场。集中全国大学的1/3。 日本政治、经济、文化、产业等方面的主要机关都集中在东京。自东京奥运会之后,东京成了一个国际性游览胜地。在政治方面来说,以皇宫为中心,霞关、永田町的国会大楼附近集中了许多国家机关。丸之内是商业中心,丸大楼、新丸大楼等高层大楼很多。文化设施,有东京大学、早稻田大学、中央大学等大约70个国立、私立大学,还有上野国立博物馆、科学物、西洋美术馆等各种博物馆和美术馆,图书馆也很多。繁华街有浅草、上野、池袋、新宿、涩谷、日本桥等,还有很多电影院、饮食店、百货店等。历史古迹有金龙山浅草寺、回向院、龟户神社、护国寺、天水宫、泉岳寺、增上寺、筑地本愿寺、尼古来堂、本门寺、明治神宫、靖国神社、汤岛圣堂等。主要公园有上野公园、清澄庭园、小石川后乐园、芝公园、自然教育园、新宿御苑、滨离宫、日比谷公园、六义园等。在艺术方面有江户传统的歌舞伎座、寄席(类似相声),

解州关帝庙_山西导游词

解州关帝庙_山西导游词 篇一:关帝庙导游词 关帝庙导游词 讲解人:周亚宁 有朋自远方来,不亦乐乎。亲爱的游客朋友们,欢迎你们来到景色迷人、气候宜人、美食诱人、古文化醉人的历史名城—解州。说起这美食诱人呀,我就忍不住想跟大家说一说这解州的四大名吃——其一是羊肉泡馍、其二是黍面油糕、第三是炒面油茶、第四是猪油葱 花炒面,而这四大名吃中,又以羊肉泡馍最为著名。解州羊肉泡馍选料上乘,作料齐全, 工艺独特精细,汤汁新鲜,味美可口,因而它“看着美,吃着香”,受到四方客人的称赞。有诗 云:“原汤优汁味鲜美,去寒暖胃添精神。夏天吃了防胃寒,冬天吃了暖全身。” 听到这,相信大家早已是垂延欲滴,肚子咕咕直叫了吧!所以说,来到解州,您只有再尝过 解州的羊肉泡馍之后,才算是不虚此行,满载而归呀! 谈笑间,不知不觉,素有“中华武庙之冠”美誉的解州关帝庙已经呈现在了我们的面前。中国 的关帝庙很多,但以解州关帝庙为最大。因为关公是解州常平村人,所以这座庙宇又被称为“武庙之祖”。它与山东曲阜孔子家乡的“孔庙”一文一武,遥相呼应,构成中国传统文化 中文武崇拜的两脉之源。 解州关帝庙创建于589年即隋开皇九年。扩建于宋,明毁于地震,重修于清乾隆年间,是我国现存规模最大,保护最完整,建筑技艺最为精湛的关帝庙。庙院南北长700余米,东西宽200余米,占地14万平方米,殿堂楼阁有200余间。规模巨大,气势恢宏,与关羽 的影响和名望相称。庙宇布局分南北两部分,南为结义园,北为正庙。正庙又分为前后两院,前为庙堂,后为寝宫,构成传统的“前朝后寝”格局。 大家现在看到的这个纯砖结构的建筑是全庙中轴线的最南端,也是入宫的第一道门,它叫 端门,又称“山门”。其造型古朴厚重,中门较高,左右较低,中门上书“扶汉人物”,标明 关羽是匡扶汉室的英雄人物,右门上书“精忠贯日”,左门上书“大义参天”。巧妙的将关羽 立身处世的“忠义”二字,融于联语之中。 端门对面的琉璃影壁上的图案是明朝宣德年间烧制,历经600余年的风雨沧桑,色彩依然绚丽,画面自上而下分为天、地、海三界,主体是四条蟠龙遨游飞动,衬以凤凰、麒麟、玉兔等祥禽瑞兽,流光溢彩,华贵典雅。关帝庙中的蟠龙只有四条,据说这是因为关羽死 后才被封帝的,“四”与“死”谐音,暗喻关羽不同于一般的真龙天子。 门前交叉斜竖的三根铁柱俗称“门挡”也叫“挡众”,它提醒人们到此,文官落轿,武官下马,以示对关羽的崇敬,也显示圣庙的威严。

相关主题
文本预览
相关文档 最新文档