c - 如何在 for 循环中使用 OMP(C 编程)
问题描述
我在下面做错了什么?代码将 CPU 固定在 100% 并且没有结束。似乎是一个无限循环。帮助表示赞赏。
#include <stdio.h>
int main(void)
{
unsigned long number2;
unsigned long number = 1;
#pragma omp parallel for
for (number = 1; number <= 10000; number++)
{
unsigned long max = 0, count = 0;
number2 = number;
while (number2 != 1)
{
if (number2 > max)
max = number2;
if (number2 % 2 == 0)
number2 /= 2;
else
number2 = 3 * number2 + 1;
count++;
}
}
}
更新:以下工作。
不确定根本原因是什么。本来可以
- 数据类型溢出其边界,即 int -> unsigned int
- number2 必须设为私有,等等。
#include <omp.h>
int main(int argc, char **argv)
{
unsigned int i;
#pragma omp parallel for
for (i = 1; i < 10000000; i++)
{
unsigned int number2 = i; unsigned int max; unsigned int count = 0;
while (number2 != 1)
{
if (number2 > max)
max = number2;
if (number2 % 2 == 0)
number2 /= 2;
else
number2 = 3 * number2 + 1;
count++;
}
}
}```
解决方案
在您的代码的第一个版本number2
是共享的,所有线程同时访问/修改它。这是一场数据竞赛 ---> 未定义的行为。
推荐阅读
- python - 选择具有特定订单数量的用户 pandas
- c - 如何在 sqlite3 数据库中绑定浮点值?
- django - 在 Amazon SQS 上关闭 CELERY.BACKEND_CLEANUP
- linux - Bash脚本输出在执行期间未显示?
- javascript - 如何从 json 数组中获取特定的键值对
- python - 未能在 Jupyter 笔记本中使用 Python 3.7 为分类模型生成 AUC 结果
- google-apps-script - 在编辑器(Google Docs)侧边栏插件中使用 Google Analytics
- c# - 使用 Linq 匹配本地列表中任何对象的 2 属性
- python - 列表中的第一个数字变量不大于
- javascript - 使用 css 显示和 JS 将图像替换为另一个