 |  | 

Опции страницы Сделать закладку  |
 Содержание Проголосовать теги сообщества 
|
Введение Клэй Р. Бреширз (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);
|
We invite you to post a comment (not monitored by customer support) on this page or send a question directly to our support team. |