C - Matrixmultiplication - Использовать максимальный выделенный размер ОЗУ

Я пытаюсь решить следующую проблему:

«Напишите программу на C, которая умножает матрицу n x n на вектор из n элементов. Выберите n настолько большим, насколько позволяет ваша память».

Умножение матриц очень легко реализовать, и вы можете найти достаточно информации в Интернете, но я понятия не имею, как вычислить максимальный выделяемый размер моей памяти.

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

int main() {  
    int n = 0;
    float** first = (float**) malloc(sizeof(float*));

    while(1) {
        next** = (float**) realloc(first, n * sizeof(float*));
        n++;

        if (next == NULL) {
            break;
        }
    }   
}

Проблема в том, что Windows 10 использует виртуальную оперативную память и прочее, поэтому этот метод приводит к бесконечному циклу.

Любые идеи ?


person Rabobsel    schedule 08.11.2019    source источник
comment
Скомпилируйте свой код как 32-битную программу, тогда у вас довольно быстро закончится память. 32-битная программа не может адресовать более 4 ГБ виртуальной памяти или нет.   -  person Jabberwocky    schedule 08.11.2019
comment
.. или ограничить максимальный размер памяти, выделяемой вашей программой, искусственно размером вашей оперативной памяти (скажем, 8 ГБ или что-то еще).   -  person Jabberwocky    schedule 08.11.2019
comment
Выберите n настолько большим, насколько позволяет ваша память Это ужасное, плохо продуманное условие. Попробуйте это на установке Linux по умолчанию, и ваши malloc()/realloc() преуспеют, но когда вы попытаетесь фактически использовать память, убийца OOM начнет убивать процессы в системе.   -  person Andrew Henle    schedule 08.11.2019
comment
Связанный вопрос ссылка   -  person Sathvik    schedule 08.11.2019
comment
@Rabobsel узнайте, какое самое большое целое число доступно на вашей платформе, и используйте его. Я считаю, что окна должны иметь INT_MAX или что-то еще, определенное в одном из его файлов заголовков. Проверьте это и используйте это и посмотрите, как это происходит. Насколько я знаю, это создаст большую нагрузку на память, но я не уверен, как ядро ​​​​Windows справится с этим. Я полагаю, что это не позволит программе пользовательского пространства, подобной этой, полностью загружать ЦП и сделать машину не отвечающей на запросы (например, в предыдущих версиях Windows). У него должно быть что-то похожее на убийцу Linux OOM. Но вы все равно должны проверить это сами.   -  person HighOnMeat    schedule 08.11.2019
comment
См. Почему malloc не «использует» память на моем компьютере?.   -  person chux - Reinstate Monica    schedule 08.11.2019
comment
32-битный код @Jabberwocky может занимать более 4 Гб и более 8, 16 Гб и т. д.   -  person chux - Reinstate Monica    schedule 08.11.2019
comment
У моей ванильной установки Windows 10 на работе есть приятная особенность. Когда некоторые программы выделяют и используют так много памяти, что будет использоваться виртуальная память, система полностью зависает. Ничего не помогало, пока мы (отдел разработки и ИТ) не решили установить размер виртуальной памяти равным нулю. Я бы не стал использовать метод выделения, пока он работает с такой нестабильной операционной системой.   -  person the busybee    schedule 08.11.2019
comment
Вы уверены, что Выберите n настолько большим, насколько позволяет ваша память, следует интерпретировать таким образом? Скорее всего, это просто означает выбрать большое значение n, которое будет использовать максимально доступное пространство. Из соображений производительности вы можете разумно предположить, что это означает физическую оперативную память. Критическое слово здесь — выбирать, а не определять. Допустим, у вас есть 4 ГБ физической памяти, а диспетчер задач говорит, что доступно 2 ГБ, тогда n может разумно выбрать n = sqrt(2 * 1024 * 1024) / sizeof(float)) - в качестве оценки значения, которое может использовать большую часть доступной физической памяти.   -  person Clifford    schedule 08.11.2019
comment
@chux-ReinstateMonica, как это может быть?   -  person Jabberwocky    schedule 11.11.2019
comment
32-битный код @Jabberwocky относится к собственному размеру целочисленной обработки процессора, а не к его диапазону памяти. Например. Есть ли способ включить более 4 ГБ оперативной памяти в 32-разрядной ОС Windows?. 16-битные процессоры десятилетиями работали с более чем 64 КБ памяти, а 8-битные — с более чем 256 байтами.   -  person chux - Reinstate Monica    schedule 11.11.2019
comment
@chux-ReinstateMonica, но один 32-битный процесс не может адресовать более 4 ГБ памяти.   -  person Jabberwocky    schedule 11.11.2019
comment
@Jabberwocky Вы имеете в виду, что битовая ширина указателя не может превышать битовую ширину собственного целочисленного размера и что C требует этого?   -  person chux - Reinstate Monica    schedule 11.11.2019
comment
@chux-ReinstateMonica дело не в языке C, а в 32-битных программах, которые не могут адресовать более 4 ГБ, потому что у них только 32-битные регистры.   -  person Jabberwocky    schedule 11.11.2019
comment
@Jabberwocky Извините, я не могу убедить вас в возможностях регистров страниц, регистров адресов, превышающих 32-битную ширину, и других архитектур. Хотя общепринято ограничивать адрес процессора собственной целочисленной разрядностью, это ни в коем случае не является отраслевым требованием.   -  person chux - Reinstate Monica    schedule 11.11.2019
comment
@chux-ReinstateMonica Я не говорил, что это отраслевое требование, но факт в том, что по крайней мере в Windows (может быть, и в Linux тоже, не совсем уверен) 32-битный пользовательский процесс не может адресовать более 4 ГБ памяти.   -  person Jabberwocky    schedule 11.11.2019