#multithreading #pthreads #openmp #primes
#многопоточность #pthreads #openmp #простые числа
Вопрос:
Я недавно перешел на этап изучения OpenMP, поэтому, пожалуйста, потерпите меня.
У меня есть рабочие коды для получения простых чисел под указанным номером в argv [1], один из которых использует обычный цикл for и OpenMP. Вот мои следующие вопросы, которые мне нужны для понимания:
(Для обычного цикла)
- В файле, который использует обычный цикл for, почему каждая операция тестирования логически независима друг от друга до 100? Например, тестирование 5 и тестирование 7 логически независимы.
- Почему это становится НЕ независимым после 100? Например, для тестирования 105, как проверка того, делится ли 105 на 7 или 9, не зависит от теста с 5 разделениями?
(Для цикла OpenMP)
- Как 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. занят тем, что происходит в целом * (добавить)