2016-10-06 4 views
-1

Я работаю над программой FEM, написанной на C, для моей степени бакалавра, которая требует очень больших массивов (массивов, состоящих из [1 000 000] элементов) для хранения данных, а затем манипулирования их. Он также использует 2D-массивы, которые имеют похожие необычно большие размеры (например, [100 000] [100 000]).Огромный размер массива [1M] возможный переполнение стека

Программа завершается без какой-либо ошибки. Было обнаружено, что только когда программа выполнит процедуру для генерации сетки (которая использует большие 2D-массивы), она сработает.

+1

Почему у вас есть требование к компилятору, а не требование к памяти? Таблица '100K x 100K float' будет принимать 37 ГБ оперативной памяти (если только я не ошибался в математике). Лучший компилятор не сделает его лучше. Я думаю, что ваша проблема больше связана с структурами данных или алгоритмами. –

+1

Почему вы считаете, что бесплатные компиляторы не отличаются от запатентованных, поскольку речь идет о распределении огромных массивов? Это алгоритм, который является проблемой здесь (где разные компиляторы могут иметь очень разные оптимизации вектора), ОС может вступить в игру (так как вам может понадобиться извлечь часть из памяти) и т. Д. Просто размер памяти не будет разница между компиляторами сама по себе, и мы недостаточно знаем о других требованиях предлагать что-либо. –

+0

Gcc будет работать, однако ваш компьютер может не работать. – Asoub

ответ

3

Когда вы достигаете таких больших размеров, вы должны думать, действительно ли ваша матрица имеет 100 000 x 100 000 элементов или если большинство из них являются нулевыми. Если большинство из них - нули, вы должны использовать sparse matrices. Это должно облегчить использование памяти.

После этого вы должны попытаться использовать матричную декомпозицию (например, lower upper), чтобы решить вашу систему, я считаю, что вы сможете найти реализации на своем любимом языке.

Есть other people interested in such large systems, поэтому попробуйте сами, как они это сделали, и воспользуйтесь approximation/iterative solvers.

+0

+ это именно то, что я подозреваю. Массивы конечных элементов, как правило, * чрезвычайно * разрежены и обычно могут быть оптимизированы так, чтобы они были также сгруппированы. Вы не можете «масштабировать» код исследования игрушек до больших систем, не используя эти возможности. – agentp

2

При компиляции в 64-битном режиме, ни НКУ, ни Clang будет иметь никаких проблем с такими крупными массивами, при условии вы распределяете их на кучу и помните, что количество элементов превышает емкость с междунар. Итак:

#define MATRIXSIZE (100*1000L) 
typedef float row_t[MATRIXSIZE]; 
row_t *matrix = calloc(MATRIXSIZE, sizeof(*matrix)); 
for (int i = 0; i<MATRIXSIZE; i++) 
    matrix[i][i] = 1.0f; 

Вам потребуется много доступной памяти, хотя.