• 其他语言



英特尔
® 
线程处理工具和 OpenMP*
页面和feed选项
打印
收藏此页
Digg此页 | 添加到您的del.icio.us帐号
目录

介绍
作者:Clay P. Breshears

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

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

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

#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 页, 共 8 页