2013-04-04 2 views
6

Я новичок в High Performance Computing и мой первый вопрос на этом форуме, где я читал много времени.Арифметическая операция на очень больших статических массивах в C/C++

В принципе мне нужно делать арифметические операции над очень большими массивами, как, например,

double variable [9][4][300][300][300] (uninitialized) 

случай 1: Если я объявляю массив выше, как local/automatic тогда я получаю ошибку времени выполнения, если я скомпилирован без оптимизация как «g++ file.cpp» .. (ошибка есть ошибка сегментации - переполнение стека ???)

случай 2: В том же случае, как указано выше, если бы я Compi с оптимизацией код работает, как ожидалось. "g++ -O2 file.cp р»(в bssarray Теперь ???)

случай 3: Если я переменная global/static затем компилируется нормально, но тем не менее он не работает и просто дает сообщение„killed“на терминале и завершается.

Там нет реальной проблемой, но мне интересно, и вы хотите узнать, что происходит, когда очень большие массивы объявляются и где они находятся в памяти в зависимости от типа данных.

Я также осведомлен о метод генерации этих массивов во время выполнения с использованием malloc или новый. Тогда, конечно, это будет на куче.

Так что самый важный вопрос для меня -> который является наиболее эффективным методом (т.е. наименьшее время выполнения при расчете массивов в памяти) иметь дело с большими массивами при компиляции с g++ и работает на linux clusters.

Благодарим вас за терпение за чтение.

+1

Этот массив - чистое безумие. Вам нужно использовать более интеллектуальное решение для обработки этого объема данных, если ваша целевая платформа не является какой-то зверской машиной. Поскольку это, похоже, не так, потоки данных с диска в кусках или что-то подобное. –

+0

Эти массивы неизбежны. Они представляют переменные в 4-мерном пространстве. И операции памяти решают сложное нелинейное дифференциальное уравнение. И в конечном итоге код будет работать на кластере из 50 узлов с памятью более 100 ГБ. Данные действительно считываются с диска.Мое любопытство заключается в понимании того, где эти данные находятся во время выполнения, и какой раздел (bss/stack/heap) обеспечит максимальную производительность во время выполнения. – physicist

+1

Я действительно предлагаю вам сделать свою работу на основе некоторых математических библиотек, таких как armadillo или BLAS. ЛЮБОЕ ВЕЩАНИЕ, которое вы делаете, и я имею в виду ЛЮБОЕ ВЕЩИ, его невозможно превзойти исполнение этих библиотек. Подумайте об использовании их с самого начала :) – amas

ответ

7

Локальные переменные всегда быть в стеке, независимо от флагов оптимизации. И этот массив будет около 7 гигабайт! Путь больше, чем любой возможный стек.

Размер также может быть причиной не запускается, как если бы вы положили его в качестве глобального/статической переменного, то вам необходимо иметь более 7 ГБ или виртуальную память бесплатно и смежные, чтобы иметь возможность для равномерной загрузки программы.

+0

Итак, для случая 2 (из вопроса) массив все еще находится в стеке. Я думал, что размер стека равен 8 КБ? Я правильно понял? У меня не было возможности компиляции, чтобы увеличить лимит стека. – physicist

+2

Если переменная не оптимизирована, то это нигде. –

+1

@physicist Стек на большинстве современных систем находится в диапазоне от одного до четырех мегабайт. Там могут быть флаги, которые вы можете передать компоновщику для определенной системы, чтобы изменить его, но тогда стек будет такого размера для всей программы, и большую часть времени только часть (вероятно, менее половины процента от этого 7 ГБ) будет используемый. Огромная потеря памяти. Есть более эффективные способы обработки больших наборов данных на обычном домашнем ПК, например, при сопоставлении памяти с файлом. –

3

Могу ли я предложить что-то вдоль линий:

typedef double slice[300][300][300]; 

std::vector<slice> variable[9] = { 4, 4, 4, 4, 4, 4, 4, 4, 4 }; 

Таким образом, каждый вектор из 4 slice объектов будет динамически распределяемой, содержание 9 векторов не должны быть смежными друг с другом, и стек потребления достаточно для метаданных для 9 векторов.

+0

, что является интересным подходом. позвольте мне попытаться это увидеть. Спасибо. – physicist

Смежные вопросы