Как распараллелить зависимость от данных для цикла - PullRequest
1 голос
/ 24 апреля 2019

Я пытаюсь распараллелить это для цикла. Я не смог понять, как ответы других людей подставляются в значение $a и потому что от этого зависит моя программа.

Вот исходный код, который я хочу распараллелить. cvp - это исполняемая Cpp-программа. Цель этого сценария - выполнить цикл от 0 до 29, используя file_0 до file_29 с pc_0 до pc_29 и от 0 до 29 в качестве аргументов, и сгенерировать выходной файл с именами от output_0 до output_29. Обратите внимание, что программа также требует большого объема памяти, поэтому, если я смогу просто выполнить параллельное 4 (это количество ядра, которое у меня есть), это было бы здорово.

#!/bin/bash
#testing script

for a in {0..29}
do
      set -x
      ./cvp -v -w 256 -F 16,0,0,0,0 -f 5 file_$a.gz >>output_$a pc_$a $a
done

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Примерно так:

parallel --results output_{} ./cvp -v -w 256 -F 16,0,0,0,0 -f 5 file_{}.gz pc_{} {} ::: {0..29}

или:

parallel ./cvp -v -w 256 -F 16,0,0,0,0 -f 5 file_{}.gz pc_{} {} ">>" output_{} ::: {0..29}
0 голосов
/ 24 апреля 2019

Простая палатализация с bash

Вы можете создать функцию и передать переменную $a в качестве первого параметра и запустить ее в фоновом режиме &, или вы можете просто поставить & в концеВаша команда в цикле for, я предпочитаю функции.

Функция использует первый параметр $1 и делает то, что вам нравится, каждый раз, когда она вызывается.

wait будет ждать, пока весь фоновый процесс завершитсязавершен, иначе сценарий может быть завершен до фоновых процессов.

#!/bin/bash
#testing script

myfunction () {

./cvp -v -w 256 -F 16,0,0,0,0 -f 5 file_${1}.gz >>output_${1} pc_${1} ${1}

}


for a in {0..29}
do
        set -x
        myfunction ${a} &
done

wait

Если вам нравится использовать gnu -rallel, я уверен, что кто-нибудь также поможет.Это дает больший контроль над палатализацией, например, запускайте столько заданий, сколько у вас есть ядра процессора.Мой пример выше, не проверяющий такие вещи, просто запустите их все.

Так что мой пример, как он есть, не является хорошим решением, если вы хотите запустить большое количество процессов сразу.

...