0

ファイルから浮動小数点数の行列を読み取っています。マトリックスの次元は 4k * 4K です。以下のプログラムでは、now() 関数で奇妙にリセットされるだけです。マトリックスのサイズを 1k * 1K に減らしても、リセットされません。フロートは正しく読み取れますが、最後のいくつかの値はジャンクです。これらのジャンク値がどこから来ているのかわかりません。浮動小数点数の桁数が約 5 ~ 6 になるため、BUFFSIZE 6 のサイズを使用しました。それが正しいかどうかはわかりません。

#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <iostream>
#include <stdlib.h>
#include <sstream>


#define ROWS 4000
#define COLS 4000
#define BUFFSIZE 6

//#define USE_FREAD
#define USE_MMAP

double now()
{
    struct timeval tv;
    gettimeofday(&tv, NULL);
    return tv.tv_sec + tv.tv_usec / 1000000.;
}

int main()
{

    double end_time;
    double total_time;
    int i, x, y, k;
    for (k = 0; k < 1; k++)
    {
    double start_time = now();

    FILE* in = fopen("resistence_file", "rb");

    float arr[ROWS][COLS];

    char temp[BUFFSIZE];

    int val;
    std::stringstream ss;
    char* floats  = (char*)mmap(

            0,

            ROWS * COLS * sizeof(float),

            PROT_READ,

            MAP_FILE | MAP_PRIVATE,

            fileno(in),

            0

            );

    fclose(in);
    ss<<floats;

    for (int i =0; i < ROWS; i++)
    {
        for (int j = 0; j < COLS; j++)
        {
            if ((ss.getline(temp, BUFFSIZE, ' ')) )
            {
                arr[i][j] = atof((temp));
            }
        }
    }

    for (int i =0; i < ROWS; i++)
    {
        for (int j = 0; j < COLS; j++)
        {
            printf("%.1f ", arr[i][j]);
        }
        printf("\n");
    }
    munmap(floats, ROWS * COLS * sizeof(float));


    end_time = now();
    total_time = end_time - start_time;

    printf("It took %f seconds to read %d * %d matrix \n", total_time, ROWS, COLS);
    }

    return 0;
}
4

2 に答える 2

6

float arr[4000][4000];56Mb が必要です ( と仮定sizeof(float)=4)。これは、使用可能なスタックよりも大きくなる可能性が非常に高くなります。

arr静的な持続時間を得るには移動する必要があります

static float arr[ROWS][COLS];
...
int main()

またはそれを動的に割り当て、free後で記憶する

int main()
{
    float (*arr)[COLS] = malloc(sizeof(*arr) * ROWS);
    ....
    free(arr);
于 2013-06-18T15:29:23.500 に答える