【发布时间】:2019-07-23 00:10:51
【问题描述】:
我目前正在一个程序中工作,该程序在 c 中乘以矩阵,它在同一执行行中接收矩阵的大小,该程序适用于大小 900 以下的矩阵,但当达到大小超过 900 的矩阵时,我'我收到错误segmentation fault(core dumped)
在检查了互联网上的许多可用资源后,我仍然无法解决问题,这是我正在使用的代码:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#include <sys/time.h>
int main(int argc, char* argv[])
{
int tam = atoi(argv[1]);
int first[tam][tam];
int second[tam][tam];
int third[tam][tam];
int i,j,k,l,f;
srand(time(NULL));
omp_set_num_threads(omp_get_num_procs());
for (i= 0; i< tam; i++)
for (j= 0; j< tam; j++)
{
l = rand();
f = rand();
first[i][j] = l;
second[i][j] = f;
}
#pragma omp parallel for private(i,j,k) shared(first,second,third)
for (i = 0; i < tam; ++i) {
for (j = 0; j < tam; ++j) {
for (k = 0; k < tam; ++k) {
third[i][j] += first[i][k] * second[k][j];
}
}
}
}
非常感谢您的帮助,并感谢您抽出宝贵时间阅读我的问题。
【问题讨论】:
-
您是否使用过调试器来准确查看其段错误的位置?我不确定,但也许 OpenMP 不喜欢变长数组?
-
你有一个竞争条件。
-
@HenriMenke 哪里有竞争条件?我没有看到一个。唯一的写入是
third[i][j],任何两个线程都不会同时写入相同的i。 -
@Zulan 好吧,我实际上并不完全确定,但如果 OpenMP 折叠三个嵌套循环(我不知道它是否默认发生),
third[i][j] += ...将会竞争。跨度> -
@HenriMenke OpenMP 默认不折叠循环。
标签: c parallel-processing openmp