【发布时间】:2021-07-04 20:00:16
【问题描述】:
我有一个想要并行化的函数。这是连续版。
void parallelCSC_SpMV(float *x, float *b)
{
int i, j;
for(i = 0; i < numcols; i++)
{
for(j = colptrs[i] - 1; j < colptrs[i+1] - 1; j++)
{
b[irem[j] - 1] += xrem[j]*x[i];
}
}
}
我想一个不错的方法是让每个线程写入 b 数组的私有副本(它不需要是受保护的关键部分,因为它是私有副本),在线程完成后,它然后将其结果复制到实际的 b 数组。这是我的代码。
void parallelCSC_SpMV(float *x, float *b)
{
int i, j, k;
#pragma omp parallel private(i, j, k)
{
float* b_local = (float*)malloc(sizeof(b));
#pragma omp for nowait
for(i = 0; i < numcols; i++)
{
for(j = colptrs[i] - 1; j < colptrs[i+1] - 1; j++)
{
float current_add = xrem[j]*x[i];
int index = irem[j] - 1;
b_local[index] += current_add;
}
}
for (k = 0; k < sizeof(b) / sizeof(b[0]); k++)
{
// Separate question: Is this if statement allowed?
//if (b_local[k] == 0) { continue; }
#pragma omp atomic
b[k] += b_local[k];
}
}
}
但是,由于第二个 for 循环,我得到了分段错误。我不需要在那个循环上使用"#pragma omp for",因为我希望每个线程都能完全执行它。如果我注释掉 for 循环内的内容,则不会出现分段错误。我不确定会是什么问题。
【问题讨论】:
标签: c multithreading performance parallel-processing openmp