На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
Модераторы: Qraizer
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> Вопрос про PAE для решения прикладной задачи , ОС Linux
    Цитата 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 оперативы на гостевую ОС. Что имеем:

    ExpandedWrap disabled
      $ 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

    ExpandedWrap disabled
      $ grep physical /proc/cpuinfo | grep physical
      physical id : 0
      address sizes   : 42 bits physical, 48 bits virtual

    ExpandedWrap disabled
      $ free -m
                    total        used        free      shared  buff/cache   available
      Память:        6290         232        5765          10         293        5528
      Подкачка:        4882           0        4882

    Запустил вот такую простенькую прогу:
    ExpandedWrap disabled
      #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;
      }

    Выдало:
    ExpandedWrap disabled
      Bad_alloc: 10, (2684354560) байт, (2.5) Гбайт

    Т.е. более 2.5GB не позволяет выделить, по коду видно - увеличивал по 256Мегов, т.е. 2.7GB уже не отдает. Почему так, можно прочесть в неплохой статье с блэк-джеком и комиксами - это тут.

    Итого. ИМХО, лучший вариант - это отладить задачу на меньших размерностях. А потом воспользоваться "помощью друга" и запустить задачу в 64 битном исполнении на компьютере "друга". Если такого друга нет - поискать арендуемые вычислительные мощности в инете, и произвести расчет на них.
    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script execution time: 0,0271 ]   [ 16 queries used ]   [ Generated: 28.03.24, 09:24 GMT ]