upc_memget 问题:捕获到致命信号:节点 2/4 上的 SIGSEGV(11)
Issue with upc_memget: Caught a fatal signal : SIGSEGV(11) on node 2/4
我正在尝试用 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);
}
upc_memget 获取与单个线程具有关联性的连续内存块。鉴于你对 b 的声明,大约有 P*M/THREADS
个元素与线程 0 有亲和力,你的调用试图从那个线程中获取 P*M
个元素 - 发生崩溃是因为你试图将未分配的内存复制到与线程 0 具有亲和力的元素的末尾。
我正在尝试用 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);
}
upc_memget 获取与单个线程具有关联性的连续内存块。鉴于你对 b 的声明,大约有 P*M/THREADS
个元素与线程 0 有亲和力,你的调用试图从那个线程中获取 P*M
个元素 - 发生崩溃是因为你试图将未分配的内存复制到与线程 0 具有亲和力的元素的末尾。