1

UPC で行列乗算コードを書こうとしています。b_local を使用せずに直接 b を使用すると、正常に動作します。しかし、memget 関数を介して b_local を使用すると、上記のエラーで「upc_memget」行でクラッシュします。

#define N 10   //Input  Matrix A = N*P
#define P 10   //Input  Matrix B = P*M
#define M 10   //Result Matrix C = N*M

shared [N*P /THREADS] double a[N][P] , c[N][M]; 
shared [M / THREADS] double b[P][M] ;
double b_local[P][M];

int main() {

//Initialization

if(MYTHREAD==0)
        gettimeofday(&start_time,NULL); 
    upc_barrier;

    upc_memget(b_local, b, P*M*sizeof(double));

    for (k=0; k<ITER; k++) {
        /* UPC_FORALL work-sharing construct for matrix multiplication */
        upc_forall(i=0;i<N;i++;&a[i][0])  {
            // &a[i][0] determines affinity
            for (j=0; j<M; j++) { 
                c[i][j] = 0; 
                for(l=0; l< P; l++) c[i][j] +=a[i][l]*b_local[l][j];    
            }
        }
    }

    upc_barrier;

if(MYTHREAD==0)
        gettimeofday(&end_time,NULL);



}
4

1 に答える 1

2

upc_memget は、1 つのスレッドにアフィニティを持つ連続したメモリ ブロックをフェッチします。b の宣言を考えると、P*M/THREADSスレッド 0 にアフィニティを持つ要素が大まかにあり、呼び出しはその 1 つのスレッドから要素を取得しようとP*Mします。スレッド 0 にアフィニティを持つ要素の末尾を超えて未割り当てのメモリをコピーしようとするため、クラッシュが発生します。

于 2015-10-09T23:49:01.250 に答える