【发布时间】:2012-01-19 02:37:37
【问题描述】:
当我尝试运行执行矩阵加法的程序时遇到分段错误。我正在尝试单独运行程序约 1000 次(同时对每次运行进行计时并将结果写入文件)。
问题是,经过多次运行后出现分段错误 - 我能走多远取决于矩阵的大小。例如,如果我运行一个 10x10 矩阵(每个实例都有随机生成的数字),我会在 1013 次运行后出现分段错误。对于 100x100 矩阵,我在 260 次运行时出现段错误。
该程序如何工作的快速浏览如下:
- 根据输入的输入(10x10、100x100)随机生成数字并写入文件
- 从文件中读取数字并发送到 CUDA*
- CUDA 计算结果并将其写入结果文件(以及计算所花费的时间并将其写入另一个文件)
*根据 GDB 调试器,此步骤似乎导致了分段错误。下面是调试器的错误输出和导致错误的函数。
>Program terminated with signal 11, Segmentation fault.
#0 0x0000000000402f4c in readFromFile(int, char, int&, int&, float*) ()
这是实际的功能:
void readFromFile(int fd, char byte, int &matrixWidth, int &matrixHeight,float *matrix)
{
int tokenIndex = 0;
char *token = (char*) malloc(500);
int matrixIndex = 0;
while(read(fd,&byte,1)){
if(isdigit(byte)||byte=='.'){
token[tokenIndex]=byte;
tokenIndex++;
}
else if(byte==' ' && matrixHeight==0){
matrixWidth++;
token[tokenIndex]='\0';
matrix[matrixIndex]=atof(token);
//printf("Stored: %d\n",matrixOne[matrixIndex]);
tokenIndex=0;
matrixIndex++;
}
else if(byte=='\n'){
matrixHeight++;
if(tokenIndex!=0){
token[tokenIndex]='\0';
matrix[matrixIndex]=atof(token);
//printf("Stored: %d\n",matrixOne[matrixIndex]);
tokenIndex=0;
matrixIndex++;
}
}
else if(byte==' ' && matrixHeight!=0){
token[tokenIndex]='\0';
matrix[matrixIndex]=atof(token);
tokenIndex=0;
matrixIndex++;
}
//printf("Token: %s, number matrix: %f\n" , token, matrix[matrixIndex-1]);
}
}
此代码重复运行,直到出现分段错误(每次读取的文件具有不同的编号)。如果您需要更多代码,请告诉我。任何帮助将不胜感激。
【问题讨论】:
-
首先您应该以不同的方式读取这些值。我认为将每一行读取为 char 数组并将其拆分会更好,然后您可以使用
atof转换每个子字符串。除此之外,GDB 告诉您错误在 readFromFile 中,那么为什么您假设错误发生在将数字传输到 GPU 时? -
您确定 500 始终足以容纳您想要的信息吗?无论如何,最好学习如何使用调试器。它可以准确地告诉您故障发生在哪里以及当时您的索引值是多少。此外,您似乎在这里有内存泄漏,
token永远不会被释放。
标签: c segmentation-fault