Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Почему си++ не хочет создавать статические массивы больше 2-х гигабайт?

Кирилл Зеленкин Профи (548), закрыт 1 месяц назад
Общий размер массива не должен превышать 0x7fffffff байт. Почему?

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

Программа у меня 64-х битная, и виндовс то же 64-х битный, а среда разработки - вижуал студио 2022.

Можно создать динамический массив большего размера, это да. Но скорость обращения к нему почему-то получается вдвое ниже. В прошлый раз, когда задавал вопрос - комментаторы с этим не согласились и сказали, что скорость обращения к статическим и динамическим массивам одинаковая. Но она разная! По крайней мере, у меня.

И возникает желание создать статический массив больше 2-х гигабайт, или хотя бы несколько статических массивов, которые в сумме получатся больше, чем 2 гигабайта. В чём причина ограничений?

https://learn.microsoft.com/ru-ru/cpp/error-messages/compiler-errors-1/compiler-error-c2148?view=msvc-170

А про то, что это предел любой архитектуры в среде виндовс - то как-то не верится, что бы в наше время, когда некоторые программы весят десятки гигабайт, виндовс не умел нормально с ними работать.
Лучший ответ
Папа Высший разум (154726) 1 месяц назад
Ты давай не темни, а рассказывай, зачем тебе понадобился такой массив (т.е. конкретный кейс).

Насчёт "Но она разная": методику замеров - в студию. Паттерны обращения к памяти, размер массива, размер оперативки, активность фоновых процессов, прогрев перед тестом (чтобы всё легло в кэши), тут всё играет.

Как ты вообще смог померить скорость обращения к статическому массиву, который ты не можешь создать? Или у тебя тест на статический массив, укладывающийся в L1, а динамический в 500 раз больше и наполовину торчит в свопе? Тогда, конечно, скорость будет разная. Причём от динамичности она не зависит.

Кстати, а что такое "динамический массив", в твоём случае, как конкретно происходит аллокация? malloc/new? std::vector (Боже упаси)? mmap? Есть ли реаллокация в тесте?

А в текущей формулировке тебе будут отвечать только тролли, невежды и чатгпт-шные зомби. Просто потому что вопроса нет, а есть набор ключевых слов для гадания.
Павел МихаловскийПросветленный (39385) 1 месяц назад
А что не так с вектором?
Папа Высший разум (154726) Павел Михаловский, во-первых, он использует аллокацию из стандартной библиотеки, которая неэффективна. Любой высокопроизводительный контейнер сам управляет своей памятью. Разница в производительности может достигать порядка. Во-вторых, он использует её часто. Любители вектора любят его за то, что "не надо думать, сколько понадобится памяти", и это - прямой путь к написанию медленного говнокода. Поэтому рассчитывать, что они напишут .reserve(), не приходится.
Кирилл ЗеленкинПрофи (548) 1 месяц назад
Я создаю нейросеть в си++. Сам, с нуля, без пайтона.

А там нужно очень много связей между т.н. "нейронами" делать: 10 гб на саму нейросеть и ещё 10 гб на ту нейросеть, которая её обучает.

Хочу натренировать её на мультиках (которых у меня сотни гигабайт на диске), и что бы она их рисовала.

С математической частью (вычисление градиента функции, обратное распространение ошибки и пр.) ознакомлен.

Буду загружать mp4 файлы в бинарном виде, она должна научиться такие же бинарники генерить.

Матричных умножений у меня нет, так что сэкономить на кэше не получится. Видеокарты я то же не использую (не умею), за то считаю на всех шести ядрах.

А скорость - да просто посчитал скорость перемножения двух небольших массивов (по полгига) - статический вдвое быстрее.
Павел Михаловский Просветленный (39385) Кирилл Зеленкин, ты пытаешься скормить нейронке mp4-файлы, в надежде, что выдаст другой 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;
}
}
}
}
}
}
}
}
}
Папа Высший разум (154726) Кирилл Зеленкин, а, да, через указатели на указатели на указатели не следует делать. Те, кто такое советуют, не в теме даже рядом. Локальность данных и предсказуемость обращений к памяти сразу идёт лесом. Идеально - выделить один непрерывный кусок и преобразовывать многомерные индексы в одномерные самостоятельно. Если так не получится, то на верхнем уровне попилить на отдельные n-1 мерные массивы, каждый из которых сделать одномерным и преобразовывать индексы для них.
Остальные ответы
Данил Ласый Оракул (58327) 1 месяц назад
Что за бред. Зачем ему такие огромные массивы? Там всё на указателях
YT_VolkOFF Искусственный Интеллект (171644) 1 месяц назад
Ограничение на создание статических массивов размером более 2 гигабайт в C++ связано с невозможностью формата исполняемого файла PECOFF в 64-битной среде Windows поддерживать создание исполняемых файлов с размером нагрузки больше 2 ГБ.

По умолчанию неинициализированные глобальные переменные хранятся в секции .bss, и для неё установлен лимит в 2 ГБ.

Одно из возможных решений — выделение объекта динамически. При этом нужно учитывать, что работа с динамическим массивом может быть медленнее, чем со статическим.
ПапаВысший разум (154726) 1 месяц назад
Последний раз, когда я получил подобного качества ответы (пересказанный вопрос с набором шаблонных утверждений) от поддержки двух банков, я закрыл в них все продукты, а в одном - также и договоры ДБО и КБО. В одном из них меня спросили, почему я от них сваливаю. В числе причин упомянул отписки.
Папа, ахаха, люблю твои комментарии.
David Tingley Профи (508) 1 месяц назад
в си++ статические массивы ограничены 2 гигабайтами из-за архитектурных особенностей и секции .bss
ПапаВысший разум (154726) 1 месяц назад
Да ты что? Правда? Об этом в вопросе написано.
/bin/laden Искусственный Интеллект (122547) 1 месяц назад
И возникает желание создать статический массив больше 2-х гигабайт
А у меня возникает желание, чтобы работа за меня сама делалась, а я только бабло получал.
Павел Михаловский Просветленный (39385) 1 месяц назад
То что у тебя 64-битная винда ещё не значит, что ты будешь создавать 64-битные приложения. Может у тебя win32 приложение.

А поводу памяти согласен с "Папа". Надо смотреть методику тестирования

Ну окей, даже если ты хочешь упороться именно статическими массивами. Зачем пихать всё в одни массив, почему не создать несколько?
Похожие вопросы