Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C /C++でのpthreadを使用したマトリックスの加算と減算


ここでは、マルチスレッド環境を使用して行列の加算と減算を実行する方法を説明します。 pthreadは、CまたはC++で複数のスレッドを同時に実行するために使用されます。

2つの行列AとBがあります。各行列の次数は(m x n)です。各スレッドは各行を取得し、加算または減算を実行します。したがって、m行の場合、m個の異なるスレッドがあります。

#include<iostream>
#include <pthread.h>
#include <cstdlib>
#include <cstdint>
#define CORE 3
#define MAX 3
using namespace std;
int AMat[MAX][MAX] = {{10, 20, 30},
   {40, 50, 60},
   {70, 80, 50}
};
int BMat[MAX][MAX] = {{80, 60, 20},
   {30, 20, 15},
   {10, 14, 35}
};
pthread_t thread[CORE * 2];
int add[MAX][MAX], sub[MAX][MAX];
void* addMatrices(void* arg) {
   intptr_t core = (intptr_t)arg;
   // Each thread computes 1/3rd of matrix addition
   for (int i = core * MAX / 3; i < (core + 1) * MAX / 3; i++) {
      for (int j = 0; j < MAX; j++) {
         add[i][j] = AMat[i][j] + BMat[i][j];
      }
   }
}
void* subtraction(void* arg) {
   intptr_t core = (intptr_t)arg;
   // Each thread computes 1/3rd of matrix subtraction
   for (int i = core * MAX / 3; i < (core + 1) * MAX / 3; i++) {
      for (int j = 0; j < MAX; j++) {
         sub[i][j] = AMat[i][j] - BMat[i][j];
      }
   }
}
void display(){
   cout << "Matrix A: " << endl;
   for(int i = 0; i < MAX; i++) {
      for(int j = 0; j < MAX; j++) {
         cout << AMat[i][j] << " ";
      }
      cout << endl;
   }
   cout << "\nMatrix B: " << endl;
   for(int i = 0; i < MAX; i++) {
      for(int j = 0; j < MAX; j++) {
         cout << BMat[i][j] << " ";
      }
      cout << endl;
   }
}
void displayRes(){
   cout << "\nAddition: " << endl;
   for(int i = 0; i < MAX; i++) {
      for(int j = 0; j < MAX; j++) {
         cout << add[i][j] << " ";
      }
      cout << endl;
   }
   cout << "\nSubtraction: " << endl;
   for(int i = 0; i < MAX; i++) {
      for(int j = 0; j < MAX; j++) {
         cout << sub[i][j] << " ";
      }
      cout << endl;
   }
}
main() {
   display();
   int step = 0;
   for (int i = 0; i < CORE; i++) {
      pthread_create(&thread[i], NULL, &addMatrices, (void*)step);
      pthread_create(&thread[i + CORE], NULL, &subtraction, (void*)step);
      step++;
   }
   for (int i = 0; i < CORE * 2; i++) {
      pthread_join(thread[i], NULL);
   }
   displayRes();
}

出力

Matrix A:
10 20 30
40 50 60
70 80 50
Matrix B:
80 60 20
30 20 15
10 14 35
Addition:
90 80 50
70 70 75
80 94 85
Subtraction:
-70 -40 10
10 30 45
60 66 15

  1. アドレスによる関数呼び出しを使用して加算と減算を見つけるC++プログラム

    aとbの2つの数があるとします。 (a + b)と(a --b)の両方を計算できる関数を定義する必要があります。ただし、C ++の関数を使用すると、最大で1つの値を返すことができます。複数の出力を見つけるには、ポインターを使用して関数の引数に出力パラメーターを使用し、それらの変数のアドレスを使用してその関数を呼び出すことができます。この問題では、aをa + bで更新し、bをa-bで更新します。関数を呼び出すときは、これら2つの変数のアドレスを渡す必要があります。 したがって、入力がa =15、b =18の場合、出力はa + b=33およびa--b=-3になります。 これを解決するには、次の

  2. C ++を使用して、0、1、および2の配列を並べ替えます

    0、1、および2の配列が与えられた場合、すべてのゼロが1の前に最初に来て、すべての2が最後になるように、要素を並べ替えます。配列のすべての要素をインプレースで並べ替える必要があります。 この問題は、DNF(Dutch National Flag)ソートアルゴリズムを使用して解決できます。たとえば、 入力-1 − arr[ ]= {2,0,0,1,2,1 } 出力 − 0 0 1 1 2 2 説明 − DNF並べ替えアルゴリズムを使用して0、1、2を含む要素の指定された配列を並べ替えると、出力が{0,0,1,1,2,2}として出力されます。 入力-2 − arr[ ]= {0,1