编辑:找到我的答案,见下文(暂不接受我自己的答案)
在Mac OS X上,我开发了一个代码,用于计算矩阵中的浮点值,并随时间更改值(模拟金属板上的热传递)。
当我在MacBook Darwin my-mbp 14.1.0 Darwin Kernel Version 14.1.0: Thu Feb 26 19:26:47 PST 2015; root:xnu-2782.10.73~1/RELEASE_X86_64 x86_64
上运行时,一切正常。
然而重点是在a上运行它
Linux cluster0 3.13.0-40-generic #69-Ubuntu SMP Thu Nov 13 17:53:56 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
访问多个CPU的集群(从2到24进行并行计算)
在我的笔记本电脑上,一切正常(我在控制台中打印出有效的结果) 但是当我通过SFTP在服务器上传输代码,编译并运行它时,我注意到这些值慢慢地被打印为-NaN(第一次迭代只有少数数字变为NaN,但是在5-6次迭代后,所有值都变为 - NAN)
以下是我的代码的关键部分:
void initMatrix(size_t M, size_t N, double (*matrix)[M][N][2])
{
int i, j;
for (j = 0; j < N; ++j)
{
for (i = 0; i < M; ++i)
{
(*matrix)[i][j][0] = (double)(( i * ( M - i - 1 ) ) * ( j * ( N - j - 1 ) ));
}
}
printf("Matrix has been initialized\n");
}
void printMatrix(size_t M, size_t N, double (*matrix)[M][N][2], int k)
{
int i, j;
// Counting backwards since the 0,0 coordinate is at the bottom not the top
for (j = N-1; j >= 0; --j)
{
for (i = 0; i < M; ++i)
{
printf("\t");
printf("%0.1f", (*matrix)[i][j][k]);
}
printf("\n");
}
}
const size_t N = (size_t)n;
const size_t M = (size_t)m;
double mat[M][N][2];
initMatrix(M, N, &mat);
printMatrix(M, N, &mat, 0);
double tdh2 = td/(h*h);
int i, j, k, currentK, previousK;
for (k = 1; k <= np; ++k)
{
currentK = k%2;
previousK = (k-1)%2;
for (j = 1; j < N-1; ++j)
{
for (i = 1; i < M-1; ++i)
{
// Simulation calcul intensif
usleep(5);
mat[i][j][currentK] = (double)((1 - (4*tdh2))*mat[i][j][previousK] + (tdh2*(
mat[i-1][j][previousK]
+ mat[i+1][j][previousK]
+ mat[i][j-1][previousK]
+ mat[i][j+1][previousK] )));
}
}
system("clear");
printf("\n");
printMatrix(M, N, &mat, currentK);
}
我的问题是:是什么让我的代码在Linux群集上生成'-NaN',但在我的MacOS机器上完美运行?
答案 0 :(得分:2)
我发现问题是初始化矩阵的1维实际上没有被初始化(我认为这不会是一个问题,因为它后来会被赋予一个值)
void initMatrix(size_t M, size_t N, double (*matrix)[M][N][2])
{
int i, j;
for (j = 0; j < N; ++j)
{
for (i = 0; i < M; ++i)
{
(*matrix)[i][j][0] = (double)(( i * ( M - i - 1 ) ) * ( j * ( N - j - 1 ) ));
// I NEEDED TO INITIALIZE (*matrix)[i][j][1] TOO
(*matrix)[i][j][1] = (*matrix)[i][j][0];
}
}
printf("Matrix has been initialized\n");
}
问题可能来自于它在我的OS X系统上初始化为零隐式但在Linux系统上默认保持未初始化。这可以解释为什么它在我的笔记本电脑上完美运行,但不能在服务器上运行。