Папа
Высший разум
(154726)
1 месяц назад
Ты давай не темни, а рассказывай, зачем тебе понадобился такой массив (т.е. конкретный кейс).
Насчёт "Но она разная": методику замеров - в студию. Паттерны обращения к памяти, размер массива, размер оперативки, активность фоновых процессов, прогрев перед тестом (чтобы всё легло в кэши), тут всё играет.
Как ты вообще смог померить скорость обращения к статическому массиву, который ты не можешь создать? Или у тебя тест на статический массив, укладывающийся в L1, а динамический в 500 раз больше и наполовину торчит в свопе? Тогда, конечно, скорость будет разная. Причём от динамичности она не зависит.
Кстати, а что такое "динамический массив", в твоём случае, как конкретно происходит аллокация? malloc/new? std::vector (Боже упаси)? mmap? Есть ли реаллокация в тесте?
А в текущей формулировке тебе будут отвечать только тролли, невежды и чатгпт-шные зомби. Просто потому что вопроса нет, а есть набор ключевых слов для гадания.
Кирилл ЗеленкинПрофи (548)
1 месяц назад
Я создаю нейросеть в си++. Сам, с нуля, без пайтона.
А там нужно очень много связей между т.н. "нейронами" делать: 10 гб на саму нейросеть и ещё 10 гб на ту нейросеть, которая её обучает.
Хочу натренировать её на мультиках (которых у меня сотни гигабайт на диске), и что бы она их рисовала.
С математической частью (вычисление градиента функции, обратное распространение ошибки и пр.) ознакомлен.
Буду загружать mp4 файлы в бинарном виде, она должна научиться такие же бинарники генерить.
Матричных умножений у меня нет, так что сэкономить на кэше не получится. Видеокарты я то же не использую (не умею), за то считаю на всех шести ядрах.
А скорость - да просто посчитал скорость перемножения двух небольших массивов (по полгига) - статический вдвое быстрее.
Кирилл ЗеленкинПрофи (548)
1 месяц назад
связи[i][i1][i2][i3] = (double*****)malloc(16 * sizeof(double****));
for (int i4 = 0; i4 < 16; i4++) {
связи[i][i1][i2][i3][i4] = (double****)malloc(16 * sizeof(double***));
for (int i5 = 0; i5 < 16; i5++) {
связи[i][i1][i2][i3][i4][i5] = (double***)malloc(16 * sizeof(double**));
for (int i6 = 0; i6 < 16; i6++) {
связи[i][i1][i2][i3][i4][i5][i6] = (double**)malloc(16 * sizeof(double*));
for (int i7 = 0; i7 < 16; i7++) {
связи[i][i1][i2][i3][i4][i5][i6][i7] = (double*)malloc(16 * sizeof(double));
Кирилл ЗеленкинПрофи (548)
1 месяц назад
for (int i8 = 0; i8 < 16; i8++) {
связи[i][i1][i2][i3][i4][i5][i6][i7][i8] = ((rand() / 32768.1) - 0.5) * 2.8;
}
}
}
}
}
}
}
}
}
YT_VolkOFF
Искусственный Интеллект
(171644)
1 месяц назад
Ограничение на создание статических массивов размером более 2 гигабайт в C++ связано с невозможностью формата исполняемого файла PECOFF в 64-битной среде Windows поддерживать создание исполняемых файлов с размером нагрузки больше 2 ГБ.
По умолчанию неинициализированные глобальные переменные хранятся в секции .bss, и для неё установлен лимит в 2 ГБ.
Одно из возможных решений — выделение объекта динамически. При этом нужно учитывать, что работа с динамическим массивом может быть медленнее, чем со статическим.
ПапаВысший разум (154726)
1 месяц назад
Последний раз, когда я получил подобного качества ответы (пересказанный вопрос с набором шаблонных утверждений) от поддержки двух банков, я закрыл в них все продукты, а в одном - также и договоры ДБО и КБО. В одном из них меня спросили, почему я от них сваливаю. В числе причин упомянул отписки.
Павел Михаловский
Просветленный
(39385)
1 месяц назад
То что у тебя 64-битная винда ещё не значит, что ты будешь создавать 64-битные приложения. Может у тебя win32 приложение.
А поводу памяти согласен с "Папа". Надо смотреть методику тестирования
Ну окей, даже если ты хочешь упороться именно статическими массивами. Зачем пихать всё в одни массив, почему не создать несколько?
Я уже задавал вопрос такой на ответах, и мне отвечали про ограничения секции .bss в виндовсе, что это предел для любой архитектуры в среде виндовс.
Программа у меня 64-х битная, и виндовс то же 64-х битный, а среда разработки - вижуал студио 2022.
Можно создать динамический массив большего размера, это да. Но скорость обращения к нему почему-то получается вдвое ниже. В прошлый раз, когда задавал вопрос - комментаторы с этим не согласились и сказали, что скорость обращения к статическим и динамическим массивам одинаковая. Но она разная! По крайней мере, у меня.
И возникает желание создать статический массив больше 2-х гигабайт, или хотя бы несколько статических массивов, которые в сумме получатся больше, чем 2 гигабайта. В чём причина ограничений?
https://learn.microsoft.com/ru-ru/cpp/error-messages/compiler-errors-1/compiler-error-c2148?view=msvc-170
А про то, что это предел любой архитектуры в среде виндовс - то как-то не верится, что бы в наше время, когда некоторые программы весят десятки гигабайт, виндовс не умел нормально с ними работать.