2013-05-30 2 views
1

Ниже мой текущий код, который, как гласит название, я думал, будет работать параллельно. Я работаю в 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); 
} 

Благодарим за понимание и помощь, которую вы можете предложить.

+2

В зависимости от гранулярности планирования и того, как планируются процессы, это полностью pos что вся необходимая работа завершается в рамках одного системного таймлиса и поэтому выглядит последовательной. Как вы проверяете параллелизм? –

+0

Под монитором активности для macs он показывает основную программу как 1 поток и 0 использования ЦП, а для программы, которую он вызывает, показывает 1 поток и 100% использование ЦП. Возможно, я не понимаю, как работает openmp, но я думал, что основная программа будет использоваться для нескольких потоков. –

+0

Также время было большой частью того, почему я думал, что это провалилось, но это, вероятно, плохой чек. Но из отчета об эффективности видно, что только одно ядро ​​выполняет какую-либо работу. –

ответ

3

Поскольку это в основном сценарий оболочки на основе уже, рассмотреть вопрос об использовании xargs:

Прежде всего, убедитесь, что несколько экземпляров ./program не перезаписывать fileA.ppm друг друга, если вы запустите его параллельно. Предположим, вы начнете записывать их как файлA.ppm.0.004 в этом примере.

Затем сделайте скрипт вы можете ссылаться на номер пятна:

#!/bin/sh 
spot=$1 
th=$(echo "$spot" | awk '{print 0.004 + 0.005*$1 }') 
./program "$th" 19 /home/path0 418 
mv "fileA.ppm.$th" "$(printf '/home/path1/a.%04d.ppm' "$spot")" 
mv "fileB.ppm.$th" "$(printf '/home/path2/b.%04d.ppm' "$spot")" 

chmod a+x yourscript, и теперь вы можете запускать и тестировать каждый экземпляр с помощью ./yourscript 0, ./yourscript 1 и т.д.

Когда он работает, запустите их 8 (или более) параллельно с использованием:

printf "%s\n" {0..199} | xargs -P 8 -n 1 ./yourscript 
+0

Мне нужно будет изучить это определенно, по иронии судьбы, код изначально был написан для запуска с помощью сценария оболочки. Я не знал, как делать вещи параллельно без openmp (чего я тоже не знаю), поэтому я попытался создать файл .c для замены сценария оболочки. Сейчас я ужинаю, поэтому я не могу сразу это реализовать, но спасибо вам большое, и я расскажу вам о любых успехах позже. –

Смежные вопросы