【发布时间】:2014-11-14 12:55:40
【问题描述】:
我正在使用以下 C++ 代码进行矩阵乘法,它在 SIZE = 500 时运行良好。但是当 SIZE = 600 或更高时,代码会失败。 (运行时错误)
我在 Ideone.com 上运行它 它输出 “运行时错误时间:0 内存:3292 信号:11”
在我的本地机器上也出现错误
#include <cstdlib>
#include<iostream>
#include <stdio.h>
#include <sys/time.h>
using namespace std;
class Timer {
private:
timeval startTime;
public:
void start(){
gettimeofday(&startTime, NULL);
}
double stop(){
timeval endTime;
long seconds, useconds;
double duration;
gettimeofday(&endTime, NULL);
seconds = endTime.tv_sec - startTime.tv_sec;
useconds = endTime.tv_usec - startTime.tv_usec;
duration = seconds + useconds/1000000.0;
return duration;
}
static void printTime(double duration){
printf("%5.6f seconds\n", duration);
}
};
using namespace std;
const int SIZE = 600; // for size*size matrix
void MultiplyMatricesSequential(double a[][SIZE],double b[][SIZE],double ans[][SIZE]);
int i,j,k;
double s;
/*
*
*/
int main(int argc, char** argv) {
double a[SIZE][SIZE], b[SIZE][SIZE], ans[SIZE][SIZE];
// assign the numbers for matrix a and b
for (i = 0; i < SIZE; i++) {
for (j = 0; j < SIZE; j++) {
a[i][j]=(double)rand()/RAND_MAX;
b[i][j]=(double)rand()/RAND_MAX;
}
}
MultiplyMatricesSequential(a,b,ans);
return 0;
}
void MultiplyMatricesSequential(double a[][SIZE],double b[][SIZE],double ans[][SIZE])
{
Timer timer = Timer();
timer.start();
for (i = 0; i < SIZE; i++) {
for (j = 0; j < SIZE; j++) {
for (k = 0; k < SIZE; k++)
s += a[i][k] * b[k][j];
ans[i][j] = s;
s = 0.0;
}
}
double duration = timer.stop();
cout << "Sequential Method time elapsed for SIZE " << SIZE << " : ";
timer.printTime(duration);
}
那么我在这里做错了什么?
注意: 不使用定时器时还是一样。
#include <cstdlib>
#include<iostream>
#include <stdio.h>
#include <sys/time.h>
using namespace std;
const int SIZE = 500; // for size*size matrix
void MultiplyMatricesSequential(double a[][SIZE],double b[][SIZE],double ans[][SIZE]);
int i,j,k;
double s;
/*
*
*/
int main(int argc, char** argv) {
double a[SIZE][SIZE], b[SIZE][SIZE], ans[SIZE][SIZE];
// assign the numbers for matrix a and b
for (i = 0; i < SIZE; i++) {
for (j = 0; j < SIZE; j++) {
a[i][j]=(double)rand()/RAND_MAX;
b[i][j]=(double)rand()/RAND_MAX;
}
}
MultiplyMatricesSequential(a,b,ans);
return 0;
}
void MultiplyMatricesSequential(double a[][SIZE],double b[][SIZE],double ans[][SIZE])
{
for (i = 0; i < SIZE; i++) {
for (j = 0; j < SIZE; j++) {
for (k = 0; k < SIZE; k++)
s += a[i][k] * b[k][j];
ans[i][j] = s;
s = 0.0;
}
}
}
【问题讨论】:
-
我猜你的内存不足了。
-
所以我不能将 2 个大小为 600*600 的矩阵相乘吗 :(
-
不能在栈上声明三个 600x600
double数组(自动存储)。 -
不知道。我会将该错误剪切并粘贴到谷歌中,看看它告诉你什么。 (600*600 双倍)*(8 字节/双倍) ~ 2.8MB。没那么大。你将有两个矩阵和结果,所以乘以 3。仍然没有那么多内存。你的机器上有多少?
标签: c++ runtime-error