Je suis en train d'écrire un code qui effectue la multiplication de matrices N par N en utilisant le parallélisme au niveau des threads.
Pour obtenir C = A X B,
d'abord j'ai transposé la matrice B, divisé les matrices en blocs.
Un thread prend un bloc de A et B et les multiplie,
puis ajoute le résultat au bloc correspondant dans C.
Toutes les matrices sont allouées dans la mémoire heap en utilisant malloc().
Mais le problème est que pour la même entrée,
la réponse est parfois incorrecte et parfois correcte.
Je ne suis pas tout à fait sûr de pourquoi cela se produit,
mais je suppose que le code doit être amélioré en termes de sécurité des threads.
Je poste une partie de mon code.
blocks est le nombre de blocs en ligne et en colonne, c'est-à-dire N / taille du bloc.
Donc le nombre total de threads est blocs^3.
while (thread_loaded < total_thread)
{
if (thread_count < MAX_THREAD)
{
p[thread_loaded].idx = thread_idx;
p[thread_loaded].matinfo = &mi;
threads[thread_loaded] = CreateThread(NULL, 0, matmul_tlp, &p[thread_loaded], 0, &threadid[thread_loaded]);
if (threads[thread_loaded] != NULL)
{
thread_loaded++;
thread_count++;
thread_idx += blocks;
if (thread_idx >= total_thread)
thread_idx = (thread_idx % total_thread) + 1;
}
}
}
pour la fonction thread,
int i, j, k;
param* p = (param*)arg;
int blocks = BLOCKS;
int block_size = BLOCK_SIZE;
int Ar = p->idx / (blocks * blocks);
int Ac = p->idx % blocks;
int Br = (p->idx / blocks) % blocks;
int Bc = p->idx % blocks;
int Cr = p->idx / (blocks * blocks);
int Cc = (p->idx % (blocks * blocks)) / blocks;
double** A = p->matinfo->A;
double** B = p->matinfo->B;
double** C = p->matinfo->C;
DWORD res = WaitForSingleObject(mutex[Cr * blocks + Cc], INFINITE);
if (res != WAIT_OBJECT_0)
perror("impossible d'acquérir le mutex.");
for (i = 0; i < block_size; i++)
{
for (j = 0; j < block_size; j++)
{
for (k = 0; k < block_size; k++)
{
C[Cr * block_size + i][Cc * block_size + j] +=
A[Ar * block_size + i][Ac * block_size + k] *
B[Br * block_size + j][Bc * block_size + k];
}
}
}
ReleaseMutex(mutex[Cr * blocks + Cc]);
thread_count--;
return NULL;
Il serait apprécié si quelqu'un trouve une faille. :)