2010-11-14 5 views
1

Comment un opérateur +, -, *, /, etc ... peut-il être multithread?Opérateurs multithread

Dans ce paper sur le langage IDL, il affirme que tous les opérateurs utilisent le 'pool de threads' pour une vitesse d'exécution accrue.

Comment se fait-il que l'on puisse utiliser plusieurs threads pour exécuter une instruction comme 'b = a - a' (comme sur la page 42) du papier?

Quelqu'un peut-il expliquer cela? (Je considère actuellement IDL une véritable arnaque, mais peut-être quelqu'un peut changer d'avis.)

(vraiment cela vaut pour toutes les langues, comment un opérateur par mulithreaded dans un langage de programmation informatique?)

Répondre

1

Je n » Je ne connais pas l'IDL, mais c'est certainement possible si vous avez des types de niveau supérieur. Par exemple, vous pouvez facilement paralléliser les opérations de tableau. On peut supposer que c'est ce que les «4200000 pts» désignent, bien que quelqu'un ait décidé de rendre les graphiques très difficiles à lire.

A titre de comparaison, en C (avec parallélisation possible OpenMP) vous pourriez avoir quelque chose comme:

#pragma omp parallel for 
for (int i=0; i<sizeof(B)/sizeof(B[0]); i++) { 
    B[i]-=A[i]; 
} 

Dans un langage de haut niveau, tels que NumPy, Matlab ou C++, il pourrait être juste B=B-A. Tout ce qui a été dit, B=A-A me semble confusément B=0.

Vous avez demandé un opérateur parallèle dans une langue préférée? Voici un peu de Haskell:

import Control.Parallel 

pmap _ [] = [] 
pmap f (x:xs) = 
    let rest=pmap f xs 
    in rest `par` (f x):rest 

parOp op a b = pmap (uncurry op) (zip a b) 

parAdd = parOp (+) 

main = do 
    putStrLn$show ([0..300] `parAdd` [500..800]) 

Oui, c'est toujours une boucle. La multitude des opérations (pas les opérateurs) est la clé de ce type de parallélisme.

+0

Ne serait-ce pas un parallèle pour la boucle par opposition à l'opérateur supposé multithread? – Skeptic

+0

Exactement. Ceci est également mentionné dans le document lui-même: ** Pour les diagrammes de comparaison du système , les résultats sont rapportés pour les tableaux de 4,2 millions d'éléments. ** Comme pour le commentaire ci-dessus: Vous pouvez toujours fournir des surcharges d'opérateurs multithread. –

+0

Surcharge multithread des opérateurs? Hrm ... Même si vous faites référence à des opérateurs qui travaillent sur des types non-entiers, il semble toujours impossible de créer un opérateur multithread. Veuillez donner un exemple dans votre langue préférée. – Skeptic

0

Opérations primitives sur des matrices, des tableaux, etc. peuvent être parallélisés - faire défiler jusqu'à la page 41 et vous trouverez:

Pour des parcelles de comparaison du système, les résultats sont présentés pour les tableaux de 4,2 millions d'éléments.

Edit: Supposons que vous avez un tableau A = [1, 2, 3, 4, 5, 6].

Le calcul de B = A - A = [0, 0, 0, 0, 0, 0] implique 6 opérations de soustraction (1-1, 2-2, etc.).

  • Avec une seule CPU, quel que soit le nombre de threads, les soustractions doivent être effectuées en série.
  • avec plusieurs processeurs mais un seul thread, les soustractions sont également effectuées en série - c'est par définition un thread.
  • plusieurs CPU, plusieurs threads - les soustractions peuvent être réparties entre les threads/CPU et se produire ainsi simultanément (jusqu'au nombre de processeurs disponibles).
+0

Cela semble encore se résumer à des boucles parallèles ... – Skeptic

+0

... qui pourraient également être exécutées en utilisant un pool de threads. Disons que vous avez A = [1, 2, 3, 4, 5, 6]; calculer B (= A - A = [0, 0, 0, 0, 0, 0]) prend 6 opérations, mais la division entre deux threads prendra la moitié du temps - chaque thread traite la moitié du tableau et ils fonctionnent simultanément (en supposant vous avez au moins 2 processeurs). Ai-je mal compris votre question? – SimonJ

1

Je pense qu'il est important de considérer également que toutes les opérations avec + ne sont pas égales. Si vous utilisez une sorte de bibliothèque bignum, par exemple, vous pourriez être en mesure de séparer un grand nombre en parties plus petites, faire des sommes d'entiers distincts (en parallèle), puis reporter. Dans tous les cas, il ne s'agira pas d'une addition en un seul cycle aux entiers.la multiplication implique quelques étapes, et la division, beaucoup d'étapes.

Dans l'exemple donné, les points flottants (les moyennes flottantes a non-trivial adding process) avaient "4,2 millions de points de données": je doute qu'ils stockaient cela dans un petit registre de 32 bits. L'opération "simple" d'ajout est soudainement devenue un énorme processus itératif ... ou peut-être beaucoup plus rapide si on peut le faire en parallèle.

Même si des opérations simples avec de petits nombres entiers ne valent pas la peine, il est intéressant de noter que B=A+A, bien qu'apparemment simple, pourrait en réalité conduire à de nombreux calculs. 1 ligne de code ne signifie pas nécessairement 1 opération.