OpenMP и многопоточность

#multithreading #pthreads #openmp #primes

#многопоточность #pthreads #openmp #простые числа

Вопрос:

Я недавно перешел на этап изучения OpenMP, поэтому, пожалуйста, потерпите меня.

У меня есть рабочие коды для получения простых чисел под указанным номером в argv [1], один из которых использует обычный цикл for и OpenMP. Вот мои следующие вопросы, которые мне нужны для понимания:

(Для обычного цикла)

  1. В файле, который использует обычный цикл for, почему каждая операция тестирования логически независима друг от друга до 100? Например, тестирование 5 и тестирование 7 логически независимы.
  2. Почему это становится НЕ независимым после 100? Например, для тестирования 105, как проверка того, делится ли 105 на 7 или 9, не зависит от теста с 5 разделениями?

(Для цикла OpenMP)

  1. Как OpenMP и pthreading работают по-разному и как pthread будет подходить к задаче иначе, чем OpenMP?

Ниже приведены коды. Они работают нормально. :

 //prime.c    
#include <stdio.h>

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

    int candidate = atoi(argv[1]);
    int prime = 1;
    int h = 1;

    for (h; h < candidate; h  ){
        if (h > 3){
            if (h % 2 == 0) continue;
            else {
                prime = 1;
                int i = 3;
                for (i; i*i <= h; i =2){
                    if (h % i == 0){
                        prime = 0;
                        break;
                    }
                }

                // if (prime != 0) printf("Number: %d is a primen", h);
            }
        }
    }
    return 0;
}
  

Параллельный.c: (с OpenMP)

 //parallel.c (With OpenMP)
#include <stdio.h>
#include <omp.h>

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

    int candidate = atoi(argv[1]);
    int h;
    int prime = 1;

    #pragma omp parallel for
    for (h = 1; h < candidate; h  ){

        if (h > 3){

            if (h % 2 == 0) continue;

            else {
                prime = 1;
                int i = 3;
                for (i; i*i <= h; i =2){

                    if (h % i == 0){
                        prime = 0;
                        break;
                    }
                }        
                // if (prime != 0) printf("Number: %d is a primen", h);
            }
        }
    }

    return 0;
}
  

Комментарии:

1. Я не уверен, что четко понимаю ваши два первых вопроса, можете ли вы быть более конкретными: что вы получили, чего ожидали…

2. Если вы делаете свою домашнюю работу, было бы вежливо признать это 🙂 (FWIW Я думаю, что вопрос о pthreads бессмыслен. OpenMP обычно строится поверх pthreads, поэтому это программа pthreads, которая является доказательством существования, что не должно быть никакой разницы в том, как вы подходите к задаче!)

3. Это было домашнее задание, и я забыл его процитировать. Да, и вопрос был решен, поэтому этот вопрос закрыт.

Ответ №1:

Во-первых, я почти уверен, что я ваш профессор. Совпадения между вашим кодом, вашими вопросами и временем были бы слишком удивительными в противном случае. Я рад, что вы привлекаете более широкое сообщество к пониманию своей курсовой работы, но, пожалуйста, не забудьте ссылаться на такие источники, когда будете сдавать свою работу.

1) Тестирование разных чисел на простоту логически независимо. Знание того, является ли 5 простым, ничего не говорит вам о том, является ли 7 простым, и между двумя задачами нет вычислений, которые вы могли бы использовать повторно. С точки зрения параллельного программирования вы можете независимо вычислять, являются ли 5 и 7 простыми, без необходимости делиться какими-либо данными между потоками.

2) Я думаю, вы, возможно, неправильно поняли вопрос — тестирование отдельных номеров по-прежнему является независимым, независимо от того, являются ли эти числа больше или меньше 100. Проверка того, является ли число 7 простым, не имеет ничего общего с проверкой того, является ли число 105 простым. Однако в ходе тестирования, является ли 105 простым, вам необходимо выяснить, делится ли оно на любое из чисел {2, 3, 5, 7 или 9}. Эти отдельные подразделения не являются независимыми.В случае 105 вы знаете, что это число не является простым после вычисления 105 % 5 = 0 , и, следовательно, вам не нужно проверять, является ли 105 % 7 = 0 или 105 % 9 = 0 . Если бы вы распараллеливали свой внутренний цикл for, это именно то, что произошло бы — вы бы выполнили кучу дополнительной работы, которую вам не нужно было делать.

Кроме того, вы не можете использовать break оператор внутри параллельного цикла for в OpenMP. Если вы подумаете об этом, вы поймете, что такая вещь не имеет большого смысла.

3) Опять же, задаваемый вопрос немного отличается. Вопрос не в том, чем отличаются реализации, вопрос в том, как отличаются усилия программиста. Вспомните некоторые из программ Pthreads, которые мы сделали — ручное создание Pthreads и назначение работы значительно сложнее, чем простое преобразование последовательного цикла for в параллельный цикл for.

Наконец, я укажу на несколько вещей, поскольку, похоже, вы новичок в StackOverflow. Люди здесь, как правило, рады помочь с домашними вопросами, но будут отвечать лучше, когда вы будете в этом разбираться. Будьте откровенны с тем фактом, что вы делаете домашнее задание, и обязательно включите свои мысли и рассуждения, которые привели вас к тому, на чем вы сейчас находитесь. Люди здесь не хотят делать вашу работу за вас, но они хотят помочь вам понять интересные концепции, лежащие в основе вашей курсовой работы.

Дайте мне знать, если у вас есть какие-либо другие вопросы, Дэвид

Комментарии:

1. Большое вам спасибо! Я собирался процитировать это, но забыл это сделать, потому что я был очень занят этим, и я думаю, что теперь я это понял. Я тоже работал с другими членами группы, но я не думаю, что текст объяснил мне очень хорошо.

2. занят тем, что происходит в целом * (добавить)