Ниже мой текущий код, который, как гласит название, я думал, будет работать параллельно. Я работаю в Mac OSX, а в терминале я использую bash. Код написан на C, и я пытаюсь использовать openmp. Он компилируется и запускается без ошибок, но я не думаю, что он работает параллельно.Любая идея, почему этот код не работает параллельно
Чтобы объяснить код для более легкого понимания. Первый блок - это просто объявления группы переменных. Следующий фрагмент - это цикл for, который запускает команды в терминале.
Первая команда - запустить исполняемую программу с четырьмя параметрами: двойным, фиксированным целым числом, строкой и другим фиксированным целым числом. Двойная зависимость зависит от того, в какой итерации цикла for вы находитесь.
Вторая, третья, четвертая и пятая команды имеют дело с переименованием и перемещением файлов, которые вырывает исполняемая программа. И это завершает цикл for. Мои надежды заключались в том, что цикл for будет работать параллельно, поскольку каждая итерация занимает около 30 секунд.
После выхода из четырех циклов файл, который был записан в каждый цикл, затем перемещается. Я понимаю, что порядок, на который файл написан, может быть неисправен, но это будет только проблемой, когда он фактически работает параллельно!
#include <stdio.h>
#include <string.h>
int main(){
int spot;
double th;
char command[50];
char path0[] = "/home/path0";
char path1[] = "/home/path1";
char path2[] = "/home/path2";
char path3[] = "/home/path3";
#pragma omp parallel for private(command,path)
for (th=0.004, spot =0; th<1; th += 0.005, spot++) {
sprintf(command, "./program %lf 19 %s 418", th, path0);
system(command);
sprintf(command, "mv fileA.ppm a.%04d.ppm", spot);
system(command);
sprintf(command, "mv a.%04d.ppm %s", spot, path1);
system(command);
sprintf(command, "mv fileB.ppm b.%04d.ppm", spot);
system(command);
sprintf(command, "mv b.%04d.ppm %s", spot, path2);
system(command);
}
sprintf(command, "mv FNums.txt %s", path3);
system(command);
return(0);
}
Благодарим за понимание и помощь, которую вы можете предложить.
В зависимости от гранулярности планирования и того, как планируются процессы, это полностью pos что вся необходимая работа завершается в рамках одного системного таймлиса и поэтому выглядит последовательной. Как вы проверяете параллелизм? –
Под монитором активности для macs он показывает основную программу как 1 поток и 0 использования ЦП, а для программы, которую он вызывает, показывает 1 поток и 100% использование ЦП. Возможно, я не понимаю, как работает openmp, но я думал, что основная программа будет использоваться для нескольких потоков. –
Также время было большой частью того, почему я думал, что это провалилось, но это, вероятно, плохой чек. Но из отчета об эффективности видно, что только одно ядро выполняет какую-либо работу. –