ptheard 无法使用矩阵处理 Ubuntu

ptheard not working on Ubuntu with matrix

此代码在 Windows 上运行正常,但在 Ubuntu 上没有给出结果。我该怎么办?

顺便说一下,我是通过虚拟机使用Ubuntu的,不过我觉得跟这个没关系

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NUM_THREADS    4
#define MATRIX_SIZE 4

int  matrixA[MATRIX_SIZE][MATRIX_SIZE];
int  matrixB[MATRIX_SIZE][MATRIX_SIZE];
int  matrixSerial[MATRIX_SIZE][MATRIX_SIZE]={0};
int  matrixParallel[MATRIX_SIZE][MATRIX_SIZE]={0};
//Randomize matrix A and B
void randomizeMatrixAandMatrixB()
{
    int i,j;
    for(i=0; i<MATRIX_SIZE;i++)
        for(j=0; j<MATRIX_SIZE;j++)
        {
            matrixA[i][j]=rand() % 10;
            matrixB[i][j]=rand() % 10;
        }   
}
//this void is Matrix2D
void printMatrix2D(int mat2D[MATRIX_SIZE][MATRIX_SIZE])
{
    int i, j;
    for (i = 0; i < MATRIX_SIZE; i++)
    {
        for (j = 0; j < MATRIX_SIZE; j++)
        {
            printf("%d ", mat2D[i][j]); 
        }
        printf("\n");
    } 
    printf("\n");   
}

//I created this here serailMatrix
void serialMatrixMultiplication()
{   
    int row, column,i;
    for (row = 0; row < MATRIX_SIZE; row++)
        for (column = 0; column < MATRIX_SIZE; column++)
            for (i = 0; i < MATRIX_SIZE; i++)
                matrixSerial[row][column] += matrixA[row][i] * matrixB[i][column];

}

//int step for multiplyMatrix
int step_i = 0;
void *multiplyMatrix(void*arg )
{   
    int core=step_i++;
    int row, column,i;
    for (row = core * MATRIX_SIZE / 4; row < (core + 1) * MATRIX_SIZE / 4; row++){
    
        for (column = 0; column < MATRIX_SIZE; column++){
            for (i = 0; i < MATRIX_SIZE; i++) {
                        matrixParallel[row][column] += matrixA[row][i] * matrixB[i][column];
            }
        }
    }
pthread_exit(NULL);
}

//void paraleleling 
void parallelMatrixMultiplication()
{
    pthread_t *thread;
    int i;
    for (i = 0; i < NUM_THREADS; i++) {
        int* p;
        thread=malloc(sizeof(pthread_t));
        pthread_create(thread, NULL, multiplyMatrix, (void*)(p));
    }
}

int main (int argc, char *argv[])
{
    srand(time(0));
    //Randomize
    randomizeMatrixAandMatrixB();
    printf("Matrix A\n");
    printMatrix2D(matrixA);
    printf("Matrix B\n");
    printMatrix2D(matrixB);
    
    
    //Serial Matrix Multiplication
    serialMatrixMultiplication();
    printf("Serial Multiplication\n");
    printMatrix2D(matrixSerial);
    
    //Parallel Matrix Multiplication
    parallelMatrixMultiplication();
    printMatrix2D(matrixParallel);
    return 0;
}

虚拟机中运行这些代码怎么办?我在代码行中的错误在哪里?由于它在 Windows 上运行良好,在 linux 上运行良好,因此它从第一行开始将剩余值显示为 0。比如我们在一个4x4的矩阵上把它分成4个线程,第一行从0开始是这样的,我估计不是运行ning threads

For Example:
Serial Multiplaction
144 255 1 2
15 18 5 4
125 14 52 46
14 5 1 3


0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0

  1. parallelMatrixMultiplication() 启动处理线程,然后直接进入 printMatrix2D()。您不是在等待线程完成。
  2. 您有内存泄漏,因为您在 parallelMatrixMultiplication() 中重用了 thread 变量。您调用了 malloc() 但没有调用 free()

你很幸运它适用于 windows。

你的代码中缺少的是同步。

您必须等待线程完成才能显示结果。您可以使用 pthread_join

轻松做到这一点
//void paraleleling  
void parallelMatrixMultiplication()
{
    pthread_t threads[NUM_THREADS];
    int params[NUM_THREADS];
    int i;
    for (i = 0; i < NUM_THREADS; i++) {
        params[i] = i;
        pthread_create(threads+i, NULL, multiplyMatrix, &params[i]);
    }
    for (i = 0; i < NUM_THREADS; i++) {
        pthread_join(threads[i], NULL);
    }
}

如您所见,我还更改了给 multiplyMatrix 的参数以避免使用 step_i:在主线程中,准备了一个包含参数的数组。

//int step for multiplyMatrix
void *multiplyMatrix(void*arg )
{   
    int core=*(int*)arg;
    int row, column,i;
    for (row = core * MATRIX_SIZE / 4; row < (core + 1) * MATRIX_SIZE / 4; row++){
    
        for (column = 0; column < MATRIX_SIZE; column++){
            for (i = 0; i < MATRIX_SIZE; i++) {
                        matrixParallel[row][column] += matrixA[row][i] * matrixB[i][column];
            }
        }
    }
    pthread_exit(NULL);
}

最后一件事:如果两个不同的线程可以修改 matrixParallel 中的同一个单元格,那么添加一些互斥锁是个好主意。