代码在服务器群集上打印NaN,但在我的OS X机器上运行

时间:2015-03-21 23:00:59

标签: c macos printf mpi nan

编辑:找到我的答案,见下文(暂不接受我自己的答案)

在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机器上完美运行?

1 个答案:

答案 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系统上默认保持未初始化。这可以解释为什么它在我的笔记本电脑上完美运行,但不能在服务器上运行。