pthread プログラミングについて、まだよくわからないことがあります。そして、誰かが絶対的な答えを教えてくれれば幸いです。
以前の質問は次 のとおりです。単純な Pthread プログラミングで配列変数を割り当てるにはどうすればよいですか?
そして今、私は行列の乗算に取り組んでいます。これを使用するとうまく機能します:
typedef struct {
int rowIdx;
int (*matA)[SIZE], (*matB)[SIZE], (*matC)[SIZE];
} newType;
int main (){
int matriksA[SIZE][SIZE];
int matriksB[SIZE][SIZE];
int matriksC[SIZE][SIZE];
for (i=0;i<NUM_THREAD;i++) {
(*block).rowIdx = i;
(*block).matA = matriksA;
(*block).matB = matriksB;
(*block).matC = matriksC;
pthread_create(&arrThread[i], NULL, matrixMul, (void *)block);
block++;
}
}
void *matrixMul(void *x){
newType *p = (newType *) x;
int i = (*p).rowIdx;
int j,k;
for (j=0;j<SIZE;j++){
int result = 0;
for(k=0;k<SIZE;k++){
int MAik = (*p).matA[i][k];
int MBkj = (*p).matB[k][j];
result = result + (MAik*MBkj);
}
(*p).matC[i][j] = result;
}
pthread_exit(NULL);
}
matrixMul は行列乗算 matC = matA x matB を実行しています。
以前にこの構造体を使用しようとしましたが、うまくいきませんでした。
typedef struct {
int rowIdx;
int **matA, **matB, **matC;
} newType;
どうやら私が読んだことから、変数配列は、配列の最初の要素のアドレスを保持するポインターと見なすことができます。2 次元配列に関しては、コンパイラに列のサイズを伝える必要があります。したがって、typedef 構造体では **matA の代わりに (*matA)[SIZE] を使用する必要があります。
しかし、私はそこで何をしていたのかまだわかりません。ポインターを割り当てて 2D 配列を別の 2D 配列にコピーしただけですか? ちょっと紛らわしい....笑...
次の質問は、これらの行に関するものです。
(*block).matA = matriksA;
(*block).matB = matriksB;
(*block).matC = matriksC;
そこで実際に何が起こったのですか?上記のコードの各ブロック変数には、行列データの独自のコピーがありますか? それとも、ポインターがメモリ内の同じ場所を参照するようにして共有するだけですか?つまり、matA、matB、および matC は (オブジェクト指向プログラミングのように) 静的変数のように動作しますか? つまり、matA、matB、および matC のコピーは 1 つしかありません。スレッドは共有データに同時にアクセスしますか? または、「matA」のコピーが多数あり、それぞれが RAM に独自の異なる割り当てを持っていますか?
私の最初の投稿と同じ質問ですが、これらの行の背後で何が起こったのですか? (*z).arrA = arrayA; (*z).arrB = arrayB; (*z).arrC = arrayC;
上記のコードは、タスク (配列の加算と行列の乗算) を実行するのに十分効率的ですか? または、メモリ割り当ての観点からより効率的な別の方法はありますか?
@Code-Guru: 新しい質問を投稿しました。