Как эффективно провести параллельную эту вложенную таблицу?


2

У меня есть 8 ядра процессора и хотите параллельно оценить следующие вложенная Table

Table[Table[expr[i,j], {i,1,10}], {j,1,4}] 

Но есть проблема, время стоимость оценки expr[i,j] возрастает с увеличением значения переменной i. Если expr[1,j] занимает 5 минут, expr[2,j] займет 10 минут, а expr[10,j] займет 3 часа. Теперь вы видите, вне зависимости от того, где я поставлю Parallel, во внешнем Table или во внутреннем Table эффективность не изменится.

Лучше всего было бы сначала оценить большую часть времени отнимает много терминов expr[10,1], expr[10,2], expr[10,3], expr[10,4] и другие выражения с меньшим количеством времени, стоимости просто бросить на оставшиеся ядра один за другим. Я наивно пытался несколько параллельных заказа, например

ParallelTable[expr[i,j], {i,10,1,-1}, {j,1,4}] 

, но это не будет использовать 4 ядра из моих 8 ядер. Вопрос в том, как лучше всего распараллелить эту оценку вложенных таблиц?

  0

После написания моего (обновлено) ответ, казалось странно знакомым. Я считаю, что у нас есть дубликат: [(20713)] (http://mathematica.stackexchange.com/q/20713/121) - просмотрите это Q & A; если вы согласитесь, что это дубликат, я закрою и удалю свой ответ. 26 авг. 132013-08-26 02:15:38

  0

@ Mr.Wizard Да, проблема такая же. Но у меня есть вопрос. Вы предлагаете в комментарии использовать f @@ # и получить f [i, j]. Что делать, если моя функция 'f [parameter1, i, parameter2, j]'? 26 авг. 132013-08-26 02:56:28

  0

Если я понимаю, что вам нужно будет 'f [parameter1, #, parameter2, # 2] & @@ # &' или, возможно, лучше в этом случае: 'f [parameter1, # [[1]], parameter2, # [[2 ]]] & ' 26 авг. 132013-08-26 03:01:12

  0

@ Mr.Wizard Черт! Как я мог быть таким глупым. Просто небольшой трюк. Почему это просто не может прийти мне в голову. Благодарю вас, мистер Волшебник 26 авг. 132013-08-26 04:00:22

  0

Не будьте так тяжелы. Я совершаю много ошибок и пропускаю или забываю много хороших «трюков». 26 авг. 132013-08-26 04:42:29

2

Это аналогичный вопрос Efficient way to utilise Parallel features to make use of many cores.

Однако, в дополнение к ответам там вы должны знать:

Если время для каждой оценки expr длинны, даже если не так долго, как вы описываете, то вы не получите от массового обслуживания нескольких операций на ядро. Вместо этого подходит алгоритм, который просто ждет свободного ядра. В документации для Parallelize состояний:

Method -> "FinestGrained" подходит для вычислений с участием нескольких субъединиц, чьи оценки принимают разное количество времени. Это приводит к более высоким накладным расходам, но максимизирует балансировку нагрузки.

В сочетании с изменением Сабольч в Tuples и ParallelMap метод:

ParallelMap[Labeled[Pause[RandomReal[{0, 0.1}]]; {#[[2]], #[[1]]}, $KernelID] &, 
  [email protected]@{4, 10}, Method -> "FinestGrained"] ~Partition~ 10 

enter image description here

  0

Я боюсь, что настройка «finestGrained» - это то же самое. Попробуйте 'ParallelTable [Labeled [Framed [i, j], $ KernelID], {j, 1, 4}, {i, 1, 10}, Метод ->" FinestGrained "]' 26 авг. 132013-08-26 01:39:58

  0

@matheorem Hm ... I видеть. Я на самом деле не пытался это ответить; это всегда бедно. Позвольте мне взглянуть на это снова. 26 авг. 132013-08-26 01:47:52

  0

@matheorem Отвечено обновлено. 26 авг. 132013-08-26 01:57:07

  0

Что делает 'пауза'? 26 авг. 132013-08-26 02:10:41

  0

@matheorem Это было просто для имитации оценки функции с переменным количеством времени. 26 авг. 132013-08-26 02:11:39

+1

Я думаю, что мой вопрос, может быть, немного отличается от этого «Эффективный способ использования параллельных функций для использования многих ядер». Потому что в моем случае «Метод ->« FinestGrained »' имеет важное значение для гарантии порядка оценки. 26 авг. 132013-08-26 12:19:06

  0

@matheorem Я собираюсь повторно открыть этот вопрос на основе этого утверждения. 26 авг. 132013-08-26 15:39:49