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
parallelMatrixMultiplication()
启动处理线程,然后直接进入 printMatrix2D()
。您不是在等待线程完成。
- 您有内存泄漏,因为您在
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, ¶ms[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
中的同一个单元格,那么添加一些互斥锁是个好主意。
此代码在 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
parallelMatrixMultiplication()
启动处理线程,然后直接进入printMatrix2D()
。您不是在等待线程完成。- 您有内存泄漏,因为您在
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, ¶ms[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
中的同一个单元格,那么添加一些互斥锁是个好主意。