Comment mettre en parallèle cette table imbriquée efficacement?


2

J'ai un processeur 8 cœur et que vous souhaitez parallèle évaluer la imbriquée suivante Table

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

Mais il y a un problème, le coût du temps d'évaluer expr[i,j] augmente avec la valeur de la variable i. Si expr[1,j] prend 5min, expr[2,j] prendra 10min et expr[10,j] prendra 3hours. Maintenant vous voyez, peu importe où je vais mettre Parallel, dans le Table extérieur ou dans le Table intérieur, l'efficacité ne changera pas.

La meilleure façon serait d'évaluer d'abord le plus de temps, les termes expr[10,1]expr[10,2], expr[10,3], expr[10,4] et d'autres expressions à moindre coût du temps il suffit de jeter sur le noyau, un par un reste. Je naïvement essayé plusieurs ordre parallèle, par exemple

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

mais ce ne sera pas utiliser 4 cœurs de mes 8 cœurs. La question est de savoir quelle est la meilleure façon de paralléliser cette évaluation de table imbriquée?

  0

Après avoir écrit mon (mis à jour) répondre semblait étrangement familière. Je crois que nous avons un doublon: [(20713)] (http://mathematica.stackexchange.com/q/20713/121) - s'il vous plaît examiner ce Q & A; Si vous acceptez qu'il s'agit d'un doublon, je vais fermer et supprimer ma réponse. 26 août. 132013-08-26 02:15:38

  0

@ Mr.Wizard ouais le problème est semblable. Mais j'ai une question. Vous suggérez dans le commentaire d'utiliser f @@ # & pour obtenir f [i, j]. Que faire si ma fonction est 'f [paramètre1, i, paramètre2, j]'? 26 août. 132013-08-26 02:56:28

  0

Si je comprends bien vous voudriez 'f [paramètre1, #, paramètre2, # 2] & @@ # &' ou peut-être mieux dans ce cas: 'f [paramètre1, # [[1]], paramètre2, # [[2 ]]] & ' 26 août. 132013-08-26 03:01:12

  0

@ Mr.Wizard Damn! Comment pourrais-je être si stupide. Juste un petit truc. Pourquoi ça ne me vient pas à l'esprit. Merci, Monsieur Assistant 26 août. 132013-08-26 04:00:22

  0

Ne sois pas si dur avec toi-même. Je fais beaucoup d'erreurs, et manque ou oublie beaucoup de "trucs". 26 août. 132013-08-26 04:42:29

2

Il s'agit d'une question similaire à Efficient way to utilise Parallel features to make use of many cores.

Cependant, en plus des réponses là-bas que vous devez savoir:

Si les temps pour chaque évaluation de expr sont longues, même si loin d'être aussi longtemps que vous décrivez, vous ne bénéficierez pas de faire la queue plusieurs opérations par noyau. Au lieu de cela, un algorithme qui attend simplement un noyau libre est approprié. Comme la documentation Parallelize états:

Method -> "FinestGrained" convient pour les calculs impliquant quelques sous-unités dont les évaluations sont différentes quantités de temps. Cela entraîne des frais généraux plus élevés, mais maximise l'équilibrage de la charge.

En combinant ceci avec une variation de la méthode de Szabolcs Tuples et ParallelMap:

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

enter image description here

  0

J'ai peur que le réglage "finestGrained" soit le même. Essayez 'ParallelTable [Etiqueté [Framed [i, j], $ KernelID], {j, 1, 4}, {i, 1, 10}, Méthode ->" FinestGrained "]' ' 26 août. 132013-08-26 01:39:58

  0

@matheorem Hm ... I voir. Je n'ai pas réellement essayé ceci avant de répondre; c'est toujours pauvre. Laissez-moi regarder à nouveau. 26 août. 132013-08-26 01:47:52

  0

@matheorem Réponse mise à jour. 26 août. 132013-08-26 01:57:07

  0

Que fait «pause»? 26 août. 132013-08-26 02:10:41

  0

@matheorem C'était juste là pour simuler l'évaluation de la fonction en prenant un temps variable. 26 août. 132013-08-26 02:11:39

+1

Je pense que ma question est peut-être un peu différente de cette "manière efficace d'utiliser des fonctionnalités parallèles pour utiliser plusieurs cœurs". Parce que dans mon cas, la 'Méthode ->" FinestGrained "' est essentielle pour garantir l'ordre d'évaluation. 26 août. 132013-08-26 12:19:06

  0

@matheorem Je vais rouvrir cette question en me basant sur cette déclaration. 26 août. 132013-08-26 15:39:49