c++与OpenMP在n体模拟器中给出-非数字(nan)
C++ with OpenMP giving -not-a-numbers (nan) in N-Body Simulator
我正在学习并行化,特别是OpenMP。我有一个连续的n体模拟器,它完美地工作并给出正确的输出,但是当我添加一个并行的for时,我所有的x,y位置输出为-nan。
在这个算法中没有竞争条件,并且parallel for创建了一个隐式屏障,所以如果我没有弄错的话(看起来我是错的),这应该可以工作。
当我在某些阶段输出new_pos
时,我开始得到像64.4358358.53这样的数字。我不明白这样的数字怎么可能存在,更不用说由计算机来表示了。
你知道是什么引起的吗?
for( int t = 0; t < TOTAL_STEPS; ++t )
{
#pragma omp parallel for num_threads( N )
for( int q = 0; q < N; ++q )
{
forces[q][X] = forces[q][Y] = 0;
for( int k = 0; k < N; ++k )
{
if( q == k ) continue;
x_diff = pos[q][X] - pos[k][X];
y_diff = pos[q][Y] - pos[k][Y];
dist = sqrt( x_diff * x_diff + y_diff * y_diff );
// performing a calculation with a distance this small introduces
// small denominator errors
if( dist > 0.01 )
{
dist_cubed = dist * dist * dist;
forces[q][X] -= 1 / dist_cubed * x_diff;
forces[q][Y] -= 1 / dist_cubed * y_diff;
}
else continue;
}
pos_new[q][X] = pos[q][X] + vel[q][X] * timestep;
pos_new[q][Y] = pos[q][Y] + vel[q][Y] * timestep;
vel_new[q][X] = vel[q][X] + ( forces[q][X] * timestep );
vel_new[q][Y] = vel[q][Y] + ( forces[q][Y] * timestep );
}
for( int i = 0; i < N; ++ i )
{
pos[i] = pos_new[i];
vel[i] = vel_new[i];
}
}
指出:
- 我知道N线程不是最优的,但这只是练习的一部分
- 对于原型,我使用G = 1和所有质量= 1,这就是为什么我的公式可能看起来不正确
Gilles指出,解决方案是将局部变量设为私有。
#pragma omp parallel for num_threads ( N ) private( x_diff, y_diff, dist, dist_cubed )
是唯一需要修改的
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 检查输入是否不是整数或数字
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何用数字处理log(0)
- 最高有效数字侧的第N位
- 如何获取一个数字的前3位
- 查找最接近的大于当前数字的数字的索引
- 找到两对数字,使它们的乘积的绝对差最小化
- 我想做一个彼此不同但重复出现的数字
- 将数字转换为字母(例如:123 转换为一二三)
- C++如何计算用户输入的数字中的偶数位数
- 如何在C++中确定文本文件中的元素是字符还是数字
- 打印数字图案
- C++问题:用户认为数字1-100,程序提出问题不超过6次即可得到答案。无法正确
- 如何检查一个c++字符串中有多少相同的字符/数字
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 检查数字是否为NaN失败
- c++与OpenMP在n体模拟器中给出-非数字(nan)
- 将数字与NaN进行比较的结果是什么