La Multiplication de matrice avec des threads Java
Je suis en train de créer un programme Java avec des fils pour la multiplication matricielle. C'est le code source:
import java.util.Random;
public class MatrixTest {
//Creating the matrix
static int[][] mat = new int[3][3];
static int[][] mat2 = new int[3][3];
static int[][] result = new int[3][3];
public static void main(String [] args){
//Creating the object of random class
Random rand = new Random();
//Filling first matrix with random values
for (int i = 0; i < mat.length; i++) {
for (int j = 0; j < mat[i].length; j++) {
mat[i][j]=rand.nextInt(10);
}
}
//Filling second matrix with random values
for (int i = 0; i < mat2.length; i++) {
for (int j = 0; j < mat2[i].length; j++) {
mat2[i][j]=rand.nextInt(10);
}
}
try{
//Object of multiply Class
Multiply multiply = new Multiply(3,3);
//Threads
MatrixMultiplier thread1 = new MatrixMultiplier(multiply);
MatrixMultiplier thread2 = new MatrixMultiplier(multiply);
MatrixMultiplier thread3 = new MatrixMultiplier(multiply);
//Implementing threads
Thread th1 = new Thread(thread1);
Thread th2 = new Thread(thread2);
Thread th3 = new Thread(thread3);
//Starting threads
th1.start();
th2.start();
th3.start();
th1.join();
th2.join();
th3.join();
}catch (Exception e) {
e.printStackTrace();
}
//Printing the result
System.out.println("\n\nResult:");
for (int i = 0; i < result.length; i++) {
for (int j = 0; j < result[i].length; j++) {
System.out.print(result[i][j]+" ");
}
System.out.println();
}
}//End main
}//End Class
//Multiply Class
class Multiply extends MatrixTest {
private int i;
private int j;
private int chance;
public Multiply(int i, int j){
this.i=i;
this.j=j;
chance=0;
}
//Matrix Multiplication Function
public synchronized void multiplyMatrix(){
int sum=0;
int a=0;
for(a=0;a<i;a++){
sum=0;
for(int b=0;b<j;b++){
sum=sum+mat[chance][b]*mat2[b][a];
}
result[chance][a]=sum;
}
if(chance>=i)
return;
chance++;
}
}//End multiply class
//Thread Class
class MatrixMultiplier implements Runnable {
private final Multiply mul;
public MatrixMultiplier(Multiply mul){
this.mul=mul;
}
@Override
public void run() {
mul.multiplyMatrix();
}
}
J'ai juste essayé sur Eclipse et il fonctionne, mais maintenant, je veux créer une autre version de ce programme dans lequel, j'utilise un thread pour chaque cellule que je vais avoir sur le résultat de la matrice. Par exemple, j'ai deux matrices 3x3. De sorte que le résultat matrice 3x3. Alors, je veux utiliser 9 fils pour calculer chacun des 9 cellules de la matrice de résultats.
Quelqu'un peut m'aider?
En Ce Qui Concerne Meilleur
Je suis sûr que quelqu'un peut vous aider! Quels sont-ils vous aider à atteindre?
J'ai besoin d'aide à propos de la synchronisation de thread, parce que dans ce cas, je suis en utilisant seulement 3 fil. Dans l'autre programme que je veux utiliser pour 9 ou plusieurs fil (quand j'aurai de la matrice plus grande que 3x3) un pour chaque cellules. Je pense que j'ai besoin de créer une cellule de la classe, mais pour le moment je n'ai pas d'autres idées
Si vous êtes à la recherche d'un moyen de créer
oui, bien sûr!!
Si vous souhaitez créer un thread pour calculer une seule cellule d'une matrice? Pause votre programme de sorte qu'il a un appel de fonction qui permettent de calculer une seule cellule, puis invoquer qu'à partir de plusieurs threads comme vous l'avez fait ci-dessus pour l'ensemble de la matrice. ATTENTION ne vous attendez pas cette course rapide, les threads sont assez lourds de poids et vous allez souffrir de faux partage au sein de l'caches CPU. La version que vous avez est plus concurrentes que vous pouvez réaliser grâce au parallélisme interne de l'UC et de l'utilisation croissante des instructions SIMD à partir de Hotspot.
J'ai besoin d'aide à propos de la synchronisation de thread, parce que dans ce cas, je suis en utilisant seulement 3 fil. Dans l'autre programme que je veux utiliser pour 9 ou plusieurs fil (quand j'aurai de la matrice plus grande que 3x3) un pour chaque cellules. Je pense que j'ai besoin de créer une cellule de la classe, mais pour le moment je n'ai pas d'autres idées
Si vous êtes à la recherche d'un moyen de créer
n
fils où n
est le nombre de cellules il y a?oui, bien sûr!!
Si vous souhaitez créer un thread pour calculer une seule cellule d'une matrice? Pause votre programme de sorte qu'il a un appel de fonction qui permettent de calculer une seule cellule, puis invoquer qu'à partir de plusieurs threads comme vous l'avez fait ci-dessus pour l'ensemble de la matrice. ATTENTION ne vous attendez pas cette course rapide, les threads sont assez lourds de poids et vous allez souffrir de faux partage au sein de l'caches CPU. La version que vous avez est plus concurrentes que vous pouvez réaliser grâce au parallélisme interne de l'UC et de l'utilisation croissante des instructions SIMD à partir de Hotspot.
OriginalL'auteur WhatElse88 | 2015-09-03
Vous devez vous connecter pour publier un commentaire.
Avec ce code, je pense que je résoudre mon problème. Je n'utilise pas synchronisés dans les méthodes mais je pense que ce n'est pas nécessaire dans ce cas.
OriginalL'auteur WhatElse88
Vous pouvez créer
n
Threads comme suit (Note:numberOfThreads
est le nombre de threads que vous souhaitez créer. Ce sera le nombre de cellules):OriginalL'auteur Nicholas Robinson
Veuillez utiliser le nouvel Exécuteur testamentaire cadre de créer des Threads, au lieu de faire manuellement la plomberie.
OriginalL'auteur RobAu
En termes simples, ce que vous devez faire est,
1) Créez n (pas de cellules dans la matrice résultante) threads. Leur assigner des rôles. (Ex: Envisager de M X N, où M et N sont des matrices. 'thread1" est responsable de la multiplication de M row_1 éléments avec N column_1 éléments et de stocker le résultat. C'est la valeur de la matrice résultante est cell_1.)
2) Début de chaque thread du processus. (par la méthode start ())
3) Attendre jusqu'à ce que tous les fils de finition de leurs processus et de stocker la valeur résultante de chaque cellule. Parce que ces processus devrait être terminé avant l'affichage de la matrice résultante. (Vous pouvez le faire en join() les méthodes, et d'autres possibilités trop)
4) Maintenant, vous pouvez afficher la matrice résultante.
Remarque:
1) Puisque, dans cet exemple, les ressources partagées (M et N) sont utilisées uniquement pour lire seul but, vous n'avez pas besoin d'utiliser "synchronisé" les méthodes pour y accéder.
2) Vous pouvez le voir, dans ce programme, il y a un groupe de threads en cours d'exécution et tous les besoins pour atteindre un statut particulier de leur propre, avant de continuer à la prochaine étape de l'ensemble du programme. Ce multi-thread modèle de programmation est connu comme un Barrière.
OriginalL'auteur Supun Wijerathne
Dans ma solution que j'ai attribué à chaque travailleur un certain nombre de lignes
numRowForThread
est égal à: (nombre de lignes de matA)/(nombre de threads).où, pour la
class Mat
, j'ai utilisé cette mise en œuvre:OriginalL'auteur Massimiliano Giunchi
Essayé le code ci-dessous dans eclipse comme par thread pour chaque cellule. Il fonctionne très bien, vous pouvez vérifier.
OriginalL'auteur gopal pawar