• Выбор языка



Инструментарий Intel
® 
Threading Tools и OpenMP*



Опции страницы
Распечатать | Отправить другу | Поддержка
Сделать закладку
Digg this | Добавить в вашей del.icio.us учетную запись
Содержание
Проголосовать
теги сообщества

Поиск тегов
 

Введение
Клэй Р. Бреширз (Clay P. Breshears)

Для создания и синхронизации потоков, а также для управления ими, в таких явных методах реализации многопоточности, как потоки Win32* или POSIX*, используются библиотеки. Использование явных потоков требует полной реструктуризации кода. OpenMP* – это набор директив, функций прикладных программных интерфейсов и переменных окружения, позволяющих внедрять потоки в приложения на достаточно высоком уровне. Директивы OpenMP используются для обозначения областей кода, которые можно выполнять одновременно. Компиляторы, совместимые с OpenMP, трансформируют код и вставляют необходимые вызовы функций для параллельного запуска указанных областей. В большинстве случаев последовательная логика оригинального кода может быть сохранена и без труда восстановлена путем игнорирования директив OpenMP во время компиляции.

Программы OpenMP – это многопоточные программы, и они могут содержать те же ошибки и проблемы производительности, что и приложения с явными потоками. Предполагается, что вы знакомы с OpenMP, поскольку в данной статье рассматривается использование инструментов Intel® Threading Tools, Intel® Thread Checker и Thread Profiler для анализа программ OpenMP. Что касается Intel Thread Checker, то мы отказались от обычного использования идентификационных конфликтов хранения в исходном коде, разделенном на потоке. Вместо этого мы используем диагностический вывод для идентификации и категоризации объема переменных в рамках параллельных областей. После этого обсуждаются две из наиболее характерных проблем производительности, которые наблюдаются в исходных кодах OpenMP. На примере демонстрируется использование Thread Profiler для выявления этих проблем, а также приводятся некоторые пути их решения. Для получения более подробной информации об использовании инструментария Intel Threading Tools см. документы "Приступая к работе с Intel Thread Checker" и "Приступая к работе с Thread Profiler", входящие в комплект документации для инструментов многопоточности.

Для того чтобы более наглядно проиллюстрировать нашу точку зрения, мы выбрали для анализа исходный код, в котором применяется алгоритм перебора для поиска простых чисел в пользовательском диапазоне переменных. Последовательный код выбирает потенциальное простое число (четные числа даже не рассматриваются) и делит его на все переменные, меньшие или равные квадратному корню этого числа. Если деление происходит без остатка, число является сложным, если с остатком – простым. Также существует возможность распечатки всех простых чисел, при этом всегда вычисляется количество найденных простых чисел. Известно, что простые числа, большие, чем 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 

We invite you to post a comment (not monitored by customer support) on this page or send a question directly to our support team.