C 在OpenMP中使用任务指令的正确方法是什么
我正在尝试使用OpenMP任务乘以两个矩阵。这是一个基本代码:C 在OpenMP中使用任务指令的正确方法是什么,c,openmp,C,Openmp,我正在尝试使用OpenMP任务乘以两个矩阵。这是一个基本代码: long i, j, k; for (i = 0; i < N; i ++) for (j = 0; j < N; j ++) for (k = 0; k < N; k ++) c[i * N + j] += a[i * N + k] * b[k * N + j]; 长i,j,k; 对于(i=0;i
long i, j, k;
for (i = 0; i < N; i ++)
for (j = 0; j < N; j ++)
for (k = 0; k < N; k ++)
c[i * N + j] += a[i * N + k] * b[k * N + j];
长i,j,k;
对于(i=0;i
所以,我想在列级别使用task,然后我修改了如下代码:
long i, j, k;
#pragma omp parallel
{
#pragma omp single
{
for (i = 0; i < N; i ++)
#pragma omp task private(i, j, k)
{
for (j = 0; j < N; j ++)
for (k = 0; k < N; k ++)
c[i * N + j] += a[i * N + k] * b[k * N + j];
}
}
}
长i,j,k;
#pragma-omp并行
{
#布拉格omp单曲
{
对于(i=0;i
当我运行一个程序时,我得到如下消息:
long i, j, k;
#pragma omp parallel
{
#pragma omp single
{
for (i = 0; i < N; i ++)
#pragma omp task private(i, j, k)
{
for (j = 0; j < N; j ++)
for (k = 0; k < N; k ++)
c[i * N + j] += a[i * N + k] * b[k * N + j];
}
}
}
分段故障(堆芯转储)
现在,我知道我遗漏了一些东西,但我想不出是什么。有什么想法吗?OpenMP中的私有变量没有初始化,并且具有随机初始值。当任务执行时,
i
将具有随机值,因此可能导致对c[]
和a[]
的越界访问
firstprivate
变量类似于private
,但其初始值设置为输入构造时引用变量的值。在您的情况下,i
必须是firstprivate
而不是private
此外,建议将并行区域中的i
设为private
,以获得较小的性能提升。因此,最终的代码应该是这样的(所有变量共享类都显式编写,私有变量在其使用范围内声明):
#pragma omp并行共享(a、b、c)
{
#布拉格omp单曲
{
龙我;
对于(i=0;i