使用C中的大浮点数据

时间:2014-03-07 09:30:16

标签: c matrix floating-point large-data

我想用一些大小为2048 * 2048的矩阵进行一些计算。但是模拟器停止工作并且它不模拟代码。我明白问题是关于变量的大小和类型。例如,我运行一个简单的代码,如下所示,以检查我是否正确。我应该在声明变量A后打印1但是它不起作用。

请注意我使用的是Codeblocks。 WFM是一个在文本文件中写入浮点矩阵的函数,它可以正常工作,因为我在使用其他矩阵之前检查它。

int main()
{
    float A[2048][2048];
    printf("1");

    float *AP = &(A[0][0]);
    const char *File_Name = "example.txt";
    int counter = 0;
    for(int i = 0; i < 2048; i++)
        for(int j = 0; j < 2048; j++)
        {
            A[i][j] = counter;
            ++counter;
        }
    WFM(AP, 2048, 2048, File_Name , ' ');

    return 0;
}

处理这个问题和更大的矩阵的任何帮助和建议都是值得赞赏的。 感谢

2 个答案:

答案 0 :(得分:2)

float A[2048][2048];

需要约。堆栈内存2K * 2K * 8 = 32M。但通常情况下,进程的堆栈大小远小于此。请使用alloc系列动态分配。

答案 1 :(得分:0)

float A[2048][2048];

对于本地数组而言,这可能太大了,您应该通过malloc等函数动态分配内存。例如,您可以这样做:

float *A = malloc(2048*2048*sizeof(float));
if (A == 0)
{
    perror("malloc");
    exit(1);
}

float *AP = A;
int counter = 0;
for(int i = 0; i < 2048; i++)
    for(int j = 0; j < 2048; j++)
    {
        *(A + 2048*i + j) = counter;
        ++counter;
    }

当您不再需要A时,可以free(A);释放它。


有关2级功率大型阵列效率陷阱的有用链接(由@LưuVĩnhPhúc提供):

Why is transposing a matrix of 512x512 much slower than transposing a matrix of 513x513?
Why is my program slow when looping over exactly 8192 elements?
Matrix multiplication: Small difference in matrix size, large difference in timings