使用OpenMP并行化C语言曼德博集合绘制程序出现异常的排查咨询
曼德博集合OpenMP并行化错误修复方案
核心问题列表
- 错误配置了坐标变量的归约属性:
cx、cy是每个像素对应的坐标参数,不需要累加求和,你给这两个变量加了reduction(+:)会导致坐标计算完全错误,这是输出图像异常的核心原因。 - 临时变量未设置私有属性:
x、y、x2、y2、n、c这些每个循环迭代内独立使用的变量没有声明为私有,多线程运行时会互相覆盖值,导致迭代次数、坐标计算混乱。 - 统计变量未配置归约:需要累加的
nTotalIterationsCount没有加reduction属性,多线程写会出现数据竞争,统计结果不准确。 - 并行下坐标累加逻辑错误:原本串行代码中逐行累加
cy的逻辑在并行下不可用,多线程执行j循环的顺序不固定,累加得到的cy值完全不符合预期。
修复代码
把你原来的OpenMP并行块替换为以下内容即可:
#pragma omp parallel private(i, j, n, x, y, x2, y2, cx, cy, c) reduction(+:nTotalIterationsCount) { #pragma omp for for (j = 0; j < IMAGE_HEIGHT; j++) { // 直接用j计算当前行对应的cy值,避免多线程累加混乱 cy = MIN_Y + j * fDeltaY; cx = MIN_X; for (i = 0; i < IMAGE_WIDTH; i++) { x = cx; y = cy; x2 = x * x; y2 = y * y; for (n = 0; (n < MAX_ITERS) && (x2 + y2 < 4); n++) { y = 2 * x * y + cy; x = x2 - y2 + cx; x2 = x * x; y2 = y * y; } c = ((long)n * 255) / MAX_ITERS; png_plot(pPng, i, j, c, c, c); cx += fDeltaX; nTotalIterationsCount++; } } }
补充说明
只要你使用的png_plot函数是线程安全的(即不同线程写入不同坐标的像素点没有内存冲突),上述代码不需要额外加锁,可以正常运行输出正确的曼德博集合图像。
内容的提问来源于stack exchange,提问作者WhiteSte
相关产品推荐
相关产品推荐

