Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: Общие вопросы > Быстрая упаковка/распаковка 1D-массива в 3D-массив |
Автор: Prok12 10.3.2016, 17:26 | ||
Необходимо как можно быстрее упаковать динамический одномерный массив (1D) в динамический трёхмерный (3D). И обратно. Зачем? Вычислительный модуль на CPU работает с трёхмерными массивами большой размерности. Примерно, 1000х2000х10. Так и нагляднее код научной задачи получается, да и быстрее так обращение к элементам массива происходит (проверено). Ведь 3D динамический массив - это по сути указатель --> на массив указателей --> на массив указателей. Сейчас часть трудоёмкого кода переписана на языке OpenCL - для расчётов на GPU. Пример подключения OpenCL прямо к коду Delphi XE2 (Win64) дал в соседней ветке форума - системной. Но! В буферы памяти GPU можно передавать и забирать после расчётов только одномерные массивы. Как показали тестовые расчёты, основное время тратится не на передачу одномерных массивов туда-сюда (CPU-GPU) через шину PCI E, а именно на упаковку-распаковку 3D массива в 1D (передача на GPU) и обратно 1D в 3D после чтения 1D массива из буфера GPU: т.е. заметное время тратится программой на хосте (CPU), написанной на Delphi XE2. ------- Сейчас, например, упаковка в одномерный массив перед передачей оного на GPU тупо сделана в виде тройного цикла (пишу условно):
Аналогично - распаковка 3D ---> 1D массив. Причём внешний цикл по i даже разбит на выч.потоки-нити (Delphi-Threads) на CPU. Всё равно: дооолго! Потому как подобная операция упаковки/распаковки выполняется тысячи раз. Как можно ускорить подобную операцию? Как бы задать эквивалентность элементов 1D и 3D массивов... Типа: адреса сразу перед началом всего расчёта сопоставить. Или может как то через MemoryStream можно быстро копировать? Просто Move здесь не пройдёт - ведь как уже говорил, 3D - это массив указателей. ![]() |