Трехмерный образец

Уважаемые специалисты! Поскольку вы проявили интерес к этой теме приоткрою историю вопроса. Мы занимаемся исследованиями процессов горения твердых систем. Ранее (в 90-х) была написана простенькая программа для моделирования распространения горения в таких образцах в среде Qwick Basic. Сейчас полученные данные и накопленный опыт позволяет замахнуться на создание полноценного коммерческого пакета программ. Поскольку современный Бейсик сильно усложнился, пришлось попробовать PascalABC. Дается с трудом. Если появился интерес, пишите в личку - обрисую текущую ситуацию.

Хм, а до этого остатки массива в зубах застревали? :slight_smile:

Хм, а до этого остатки массива в зубах застревали? Да меня интересовало, нужно ли уничтожать массив до переопределения его размеров, или сборщик мусора сделает это за меня. Кстати, если Вы знаете. Если нужно создать два массива размером 100.000.000 of integer, будут ли они расположены в физической памяти, или в виртуальной, или неизвестно где. Это важно для быстродействия при частом обращении к ним.

А такой массив в стэк вообще влезет?

На стеке (stack) выделяется только память размерных типов, то есть записей. Для ссылочных типов (всех классов, в том числе массивов) на стеке выделяется только место под 1 указатель (то есть 1 указатель на каждую 1 переменную, несколько переменных могут иметь ссылку на один и тот же экземпляр класса), а само содержимое хранится в куче (heap).

Вообще куча ещё разделена на SOH и LOH, но рядовому пользователю это вряд ли будет важно.

А в физическую память данные попадают только если вы ручками их туда положите. Ну или если система отправит данные в файл подкачки. Но до последнего лучше не доводить…


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

Спасибо. Очень подробно. Особенно полезен совет использовать GPU. Предполагается выводить цветное изображение динамики изменения одного из массивов в виде параллелепипеда, да ещё иногда и вращать его.

Насчёт GPU - давно хотел сделать пример симуляции распределения тепла по телу для OpenCLABC. Надо бы сразу с графическим интерфейсом, но до OpenGLABC руки всё не дойдут. Ну раз есть повод - сделал прямо сейчас:

Симуляция тепла.rar (100.5 КБ)

W В начале программы можно поменять с 10, хоть на 100. Если GPU мощный - скорость будет одинаковая, потому что состояние каждого элемента в массиве считается параллельно. Ну, правда, текстовый вывод уже и на 10 задыхается))

Вообще OpenCLABC ещё немного сырой. Но это в первую очередь потому, что я больше времени пишу сам OpenCLABC, чем программы с ним. Недавно сильно улучшил систему авто-тестирования и добавил кучу тестов. Но пока писал этот пример - умудрился поймать 1 мелкий баг (поэтому модули в архиве, там сразу с фиксом).
Если решите его использовать - сообщайте баги что найдёте, постараюсь в течении дня исправлять. Да и, справка, если что, в папке PABCWork.NET\Samples\OpenGL и OpenCL.

Спасибо, но файл rar не распаковывается. Архив поврежден или не тот формат.

Странно, только что скачал - у меня распаковывается. И 7z-ом, и WinRAR-ом. Ну, я использовал формат rar5, то есть самый новый, попробуйте обновить свой архиватор.

Обновил. Распаковал. Пока в Pascale мой уровень гораздо ниже плинтуса. Куда эти файлы переместить и какой запускать? При запуске 2D выдает ошибку компилятора. В личке получили мои пояснения?

Перемещать ничего не надо, как распаковывается всё в 1 папку - так и оставлять.

Запускать - да, 2D.pas. Остальное модули, их запустить не выйдет.

Подробнее.

Да, прочитал, но небыло времени ответить.

При нажатии кнопки Сохранить сообщение компилятора, комп виснет. Но это, наверно, из-за плохой настройки моей Windows 10. Скопипастил в Word. Прилагаю.Ошибка компилятора.doc (34.5 КБ)

То есть это внутренняя ошибка компилятора?

  1. Обновитесь, вроде новую версию только недавно залили на сайт.

  2. У меня нет офиса и засорять им комп в ближайшем будущем не собираюсь. Если кидать файлом - то .txt (так и места меньше занимать будет). А вообще лучше всего:
    Нажмите ПКМ в окне ошибок на эту внутреннюю ошибку (её там тоже выдаёт) и Копировать. Затем вставьте сюда на форум как код, то есть:

    ```
    <<< Сюда вставить
    ```

    Когда текста много - форум сам добавляет скроллбар, так что не волнуйтесь о разбухании сообщения.

Вряд ли. Компилятор скорее целиком сломается, или никак не сломается, если с системой что. Но не для конкретного кода.

У меня этой ошибки нет скорее потому что я обычно живу на последнем билде, которого ещё нет на сайте. А там бывают исправлены баги которые на сайте ещё проявляются. Мне надо знать какую ошибку вам выдаёт - чтоб я мог подредачить что то в вашей версии модуля, чтобы работало пока на сайте версия не догонит.
Если ещё не догнала, поэтому в начале обязательно обновитесь.

Обновил. В редакторе выдает список ошибок. 2D.pas(29) : Переменной ‘Q_1Cycle2’ присвоено значение, но оно нигде далее не используется. OpenCLABCBase.pas(540) : Переменной ‘wr’ присвоено значение, но оно нигде далее не используется. OpenCL.pas(7501) : Ошибка времени выполнения: Не удается загрузить DLL “opencl.dll”: Не найден указанный модуль. (Исключение из HRESULT: 0x8007007E).

Первые 2 предупреждения а не ошибки. Q_1Cycle2 я забыл убрать, ну оно ничего не делает. А про wr выдаёт потому что #2286.

А вот opencl.dll - это графический драйвер, которого у вас нет. Он устанавливается вместе с остальными драйверами видеокарты. Но на чистой винде, или винде где скачаны только минимальные драйверы, чтоб экран был не 480x640 (или сколько там) - драйверов для программного использования GPU может и не быть.
В общем обновляйтесь дальше, теперь что касается дров видеокарты).

Скачал вашу программу - поймал ошибку

OpenCLABCBase.pas(1527) : Ошибка времени выполнения: Ошибка компиляции OpenCL программы:

Device[444988864]:
:6:33: error: must specify '#pragma OPENCL EXTENSION cl_khr_fp64: enable' before using 'double'
__kernel void CalcTick(__global double* B, __global double* BRes, int W)
                                ^

Паскаль последний

Ага, проблемы 32-битников… Ну, попробуйте добавить эту строчку с #pragma, которую вам предлагает, в начало .cl файла. У себя тоже добавил на всяк.

Но у меня 64

Вот ещё, строчку добавил

Необработанное исключение: System.AccessViolationException: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.
   в OpenCL.cl.z_EnqueueMarkerWithWaitList_ovr_0(cl_command_queue command_queue, UInt32 num_events_in_wait_list, cl_event& event_wait_list, cl_event& event)
   в OpenCL.cl.EnqueueMarkerWithWaitList(cl_command_queue command_queue, UInt32 num_events_in_wait_list, cl_event[] event_wait_list, cl_event& event) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCL.pas:строка 5319
   в OpenCLABCBase.EventList.ToMarker(cl_context c, cl_device_id dvc, cl_command_queue& cq, Boolean expect_smart_status_err) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2009
   в OpenCLABCBase.EventList.AttachCallback(Action work, CLTaskBase tsk, cl_context c, cl_device_id dvc, cl_command_queue& cq, Boolean save_err) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2064
   в OpenCLABCBase.CommandQueue`1.Invoke(CLTaskBase tsk, Context c, cl_device_id main_dvc, Boolean need_ptr_qr, cl_command_queue& cq, EventList prev_ev) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2846
   в OpenCLABCBase.CommandQueue`1.InvokeBase(CLTaskBase tsk, Context c, cl_device_id main_dvc, Boolean need_ptr_qr, cl_command_queue& cq, EventList prev_ev) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2849
   в OpenCLABCBase.SimpleSyncQueueArray`1.InvokeImpl(CLTaskBase tsk, Context c, cl_device_id main_dvc, Boolean need_ptr_qr, cl_command_queue& cq, EventList prev_ev) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 3039
   в OpenCLABCBase.CommandQueue`1.Invoke(CLTaskBase tsk, Context c, cl_device_id main_dvc, Boolean need_ptr_qr, cl_command_queue& cq, EventList prev_ev) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2845
   в OpenCLABCBase.CommandQueue`1.InvokeBase(CLTaskBase tsk, Context c, cl_device_id main_dvc, Boolean need_ptr_qr, cl_command_queue& cq, EventList prev_ev) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2849
   в OpenCLABCBase_implementation______.CLTaskResLess..ctor(CommandQueueBase q, Context c) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 4507
   в OpenCLABCBase.Context.BeginInvoke(CommandQueueBase q) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 4612
   в OpenCLABCBase.Context.SyncInvoke(CommandQueueBase q) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 4615
   в 2D.Program.$Main() в C:\Users\Миша\Downloads\Симуляция тепла\2D.pas:строка 72
   в 2D.Program.Main()

Подразумевается физическое повреждение?