Заполнение многомерной матрицы из файла происходит медленно в Windows - PullRequest
1 голос
/ 08 апреля 2019

Я написал функцию C ++ (Rcpp) для чтения и заполнения многомерной матрицы из файла, содержащего только числа.Когда я запускаю его в Linux, он работает нормально и довольно быстро.Тем не менее, тот же код гораздо медленнее (в 200 раз) на машине с Windows с той же спецификацией.Кто-нибудь может определить проблему?

void read_ed0moins_lut_(const char *filename, float downward_irradiance_table_as_output[NBWL][NTHETAS][NO3][NTAUCLD][NALB]) {

    std::ifstream infile;
    infile.open(filename);
    float tmp;
    for (int theta = 0; theta < NTHETAS; theta++) {
        for (int ozone = 0; ozone < NO3; ozone++) {
            for (int taucl = 0; taucl < NTAUCLD; taucl++) {
                for (int albedo = 0; albedo < NALB; albedo++) {
                    for (int wavelength = 0; wavelength < NBWL; wavelength++) {
                        infile >> tmp; // This line is very slow on Windows
                        downward_irradiance_table_as_output[wavelength][theta][ozone][taucl][albedo] = tmp;
                    }
                }
            }
        }
    }

    // Close file
    infile.close();
}

1 Ответ

3 голосов
/ 08 апреля 2019

Вот несколько идей:

  1. Построение в режиме Выпуск (с включенной оптимизацией, флаг -O2)

  2. Включить ifstream Буферизация:

    std::ifstream infile(filename);
    char buffer[65536];
    infile.rdbuf()->pubsetbuf(buffer, sizeof(buffer));

Расположите размеры вашего массива в порядке циклов:

downward_irradiance_table_as_output[NTHETAS][NO3][NTAUCLD][NALB][NBWL]

так, чтобы вы получили row-major-order traversal, которыйболее дружественный к кешу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...