我想用一些大小为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;
}
处理这个问题和更大的矩阵的任何帮助和建议都是值得赞赏的。 感谢
答案 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