【问题标题】:Working with big float data in C在 C 中处理大浮点数据
【发布时间】:2014-04-10 08:57:27
【问题描述】:

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

请注意,我使用代码块。 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;
}

任何处理这个问题和更大矩阵的帮助和建议都非常感谢。 谢谢

【问题讨论】:

  • 拉链刷新标准输出
  • 你为什么要声明这样一个无用的AP变量只是为了传递给这样的函数?此外,如果您需要提高性能,则需要研究优化
  • 非常感谢。可以请你给我一些关于优化的教程吗?

标签: c matrix floating-point large-data


【解决方案1】:
float A[2048][2048];

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

【讨论】:

  • 或将其声明为static float A[2048][2048],在您的情况下也可以。
  • 浮点大小很可能是 4 个字节,而不是 8 个。但是对于正常的堆栈大小来说,16MB 仍然太大
【解决方案2】:
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

【讨论】:

  • 非常感谢。 malloc 工作正常,但想象一下我有 4 或 5 个这样的矩阵,并且必须对它们进行一些计算。我的意思是处理需要很长时间,比如说 30 分钟。但是,Matlab 软件在 3 分钟内完成相同的计算。
  • 如果您想要与 matlab 类似的性能,请使用 LAPACK 矩阵算法。一个关于如何调用我在stackoverflow.com/a/21974753/3088138 中组装的 FORTRAN 过程的示例(这是 C++,但命名空间 lapack 中的过程也应该在 C 中工作,在删除 extern C 分类之后)
  • @user42037 如果可能的话,您能否发布您的完整代码以及一些输入数据?所以我们可以对其进行测试,也许可以找出它为什么这么慢。
  • 避免使用大小等于 2 次方的大型数组。将它们填充到 2049 而不是 stackoverflow.com/questions/11413855/… stackoverflow.com/questions/12264970/… stackoverflow.com/questions/7905760/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
  • 2016-09-28
相关资源
最近更新 更多