• 其他语言



英特尔
® 
多线程工具与 OpenMP*
页面和feed选项
打印
收藏此页
Digg此页 | 添加到您的del.icio.us帐号
目录
关于作者
Clay Breshears 目前是位于伊利诺斯州 Champaign 市英特尔并行应用中心的并行应用工程师。他从事并行编程及计算已有 20 多年,包括分布式内存集群中的消息传递,以及对称多处理(SMP)节点上的多线程开发。加盟英特尔公司之前,Clay 在赖斯大学任研究科学家,从事与 DoD 高性能计算合同有关的项目。


介绍
在串行应用中找出于何处能够有效实施并行。

作者 Clay P. Breshears

显式线程化方法(如,Windows* 线程或 POSIX* 线程)使用库调用创建、管理并同步线程。使用显式线程,需要对几乎所有受影响的代码进行重新构建。此外,OpenMP* 是 pragma(编译指示)、API 函数,及环境变量的集合,能够支持以相对较高的级别将线程放入应用中。OpenMP 编译指示用于指出在代码中能够同时运行的区域。支持 OpenMP 的编译器对代码进行转换,并插入适当的函数调用,来并行执行这些区域。在大多情况下,可以保留原始代码的串行逻辑,并在编译时通过忽略 OpenMP 编译指示实现轻松恢复。

OpenMP 程序为线程化程序,同显式线程化应用一样,OpenMP 程序要面对相同的错误和性能问题。因为本文主要检查英特尔® 多线程工具、英特尔® 多线程检查器,以及英特尔® 多线程分析器的使用来分析 OpenMP 程序,所以我们假设读者熟悉 OpenMP。对于英特尔® 多线程检查器,并不采用在线程化代码中识别存储冲突的标准方法;相反,我们使用诊断输出,在并行区域内识别并对变量的作用域进行分类。而后,本文讨论了在 OpenMP 代码中会常常遇到的两类性能问题。举例说明如何使用英特尔® 多线程分析器来识别这些问题,并提供了一些可行的解决方案。欲了解英特尔® 多线程工具的详细信息,请参阅线程工具文档《英特尔® 多线程检查器入门》与《英特尔® 多线程分析器入门》。

为了更具体地阐述重点,选择对实施 brute force(力迫)算法的代码进行分析,该代码用于找出用户定义整数范围内的素数。串行代码挑出每个可能的素数(不考虑偶数),并除以所有小于或等于其平方根的整数。如果有某个测试因数可将其整除,则该数为合数;如果没有因数能将其整除,则为素数。找出的素数可随意输出,但通常需要计算所找出素数的总数。我们知道大于 2 的素数能够分为 2 类:其形式分别为 4n+1 与 4n-1。除了计算找到素数的总数以外,素数相关类(被 4 除后的余数)的计算也随之增加。采用的串行代码,PrimeFinder,如下所示。

#include <stdio.h>
#include <math.h>


main(int argc, char *argv[])
{
   int i, j, limit;
   int start, end;          /* range of numbers to search */
   int number_of_primes=0;  /* number of primes found */
   int number_of_41primes=0;/* number of 4n+1 primes found */
   int number_of_43primes=0;/* number of 4n-1 primes found */
   int prime;               /* is the number prime? */
   int print_primes=0;      /* should each prime be printed? */

   start = atoi(argv[1]);
   end = atoi(argv[2]);
   if (!(start % 2)) start++;

   if (argc == 4 && atoi(argv[3]) != 0) print_primes = 1;
   printf("Range to check for Primes: %d - %d\n\n",start, end);

   for(i = start; i <= end; i += 2) {

      limit = (int) sqrt((float)i) + 1;
      prime = 1; /* assume number is prime */
      j = 3;
      while (prime && (j <= limit)) {
         if (i%j == 0) prime = 0;
         j += 2;
      }

      if (prime) {
	  if (print_primes) printf("%5d is prime\n",i);
        number_of_primes++;
        if (i%4 == 1) number_of_41primes++;
        if (i%4 == 3) number_of_43primes++;
      }
   }

   printf("\nProgram Done.\n %d primes found\n",number_of_primes);
   printf("\nNumber of 4n+1 primes found: %d\n",number_of_41primes);
   printf("\nNumber of 4n-1 primes found: %d\n",number_of_43primes);
}

上一部分上一部分2  3  4  5  下一部分

第 1 页, 共 6 页