Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.145.12.242] |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Цитата mkudritsky @ Народ, требуется консультация. На ПК решается прикладная комбинаторная Задача Коммивояжера (ЗК) методом динамического программирования достаточно большой размерности (минимум надо решить ЗК для числа городов Ng=26). На ПК установлено более 4Гб RAM и Intel-процессор с поддержкой PAE. Вопрос такой: можно ли в Linux kernel 3.13 в прикладной 32-разрядной программе задействовать более 4Гб RAM? Использование РАЕ - плохой вариант, многие ядра многих дистров Линухов от этого ушли (по умолчанию в конфиге ядра это отключено). Во многих ОС ограничения накладываются искусственно. К примеру, Windows XP не увидит более 3,1GB (точную цифру лень искать) - это маркетинговый ход, Windows 2003 Server x32 больше увидит - но и там верхняя планка тож урезана, ЕМНИП. Дистры Линухов x32 верхнюю память видят, но для этого нужно пересобрать ядро с поддержкой PAE и смотреть использование верхней памяти. PAE включится только если размер использования верхней памяти выбран именно 64GB. Вот сейчас, ради прикола заинсталлил Linux Mint с PAE (на моих рабочих Funtoo и Manjaro PAE отключен) на VMWare, выделил около 6Gb оперативы на гостевую ОС. Что имеем: $ uname -a Linux majestio-virtual-machine 4.8.0-53-generic #56~16.04.1-Ubuntu SMP Tue May 16 01:14:44 UTC 2017 i686 i686 i686 GNU/Linux $ grep physical /proc/cpuinfo | grep physical physical id : 0 address sizes : 42 bits physical, 48 bits virtual $ free -m total used free shared buff/cache available Память: 6290 232 5765 10 293 5528 Подкачка: 4882 0 4882 Запустил вот такую простенькую прогу: #include <iostream> #include <cstdint> const auto mysize = 1024ul*1024ul*256ul; int main() { auto cnt = 0; try { auto *A00 = new uint8_t[mysize]; cnt++; auto *A01 = new uint8_t[mysize]; cnt++; auto *A02 = new uint8_t[mysize]; cnt++; auto *A03 = new uint8_t[mysize]; cnt++; auto *A04 = new uint8_t[mysize]; cnt++; auto *A05 = new uint8_t[mysize]; cnt++; auto *A06 = new uint8_t[mysize]; cnt++; auto *A07 = new uint8_t[mysize]; cnt++; auto *A08 = new uint8_t[mysize]; cnt++; auto *A09 = new uint8_t[mysize]; cnt++; auto *A10 = new uint8_t[mysize]; cnt++; auto *A11 = new uint8_t[mysize]; cnt++; auto *A12 = new uint8_t[mysize]; cnt++; auto *A13 = new uint8_t[mysize]; cnt++; auto *A14 = new uint8_t[mysize]; cnt++; auto *A15 = new uint8_t[mysize]; cnt++; auto *A16 = new uint8_t[mysize]; cnt++; auto *A17 = new uint8_t[mysize]; cnt++; auto *A18 = new uint8_t[mysize]; cnt++; auto *A19 = new uint8_t[mysize]; cnt++; std::cout << "Все разместилось - надо допилить код :(" << std::endl; } catch (std::bad_alloc& ba) { std::cerr << "Bad_alloc: " << cnt << ", (" << (cnt*mysize) << ") байт" << ", (" << ((double)(cnt*mysize/1024/1024)/1024) << ") Гбайт" << std::endl; } catch (...) { std::cerr << "0_o" << std::endl; } return 0; } Выдало: Bad_alloc: 10, (2684354560) байт, (2.5) Гбайт Т.е. более 2.5GB не позволяет выделить, по коду видно - увеличивал по 256Мегов, т.е. 2.7GB уже не отдает. Почему так, можно прочесть в неплохой статье с блэк-джеком и комиксами - это тут. Итого. ИМХО, лучший вариант - это отладить задачу на меньших размерностях. А потом воспользоваться "помощью друга" и запустить задачу в 64 битном исполнении на компьютере "друга". Если такого друга нет - поискать арендуемые вычислительные мощности в инете, и произвести расчет на них. |