Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Быстрая упаковка/распаковка 1D-массива в 3D-массив, Запись из линейного массива в трёхмерный 
:(
    Опции темы
Prok12
  Дата 10.3.2016, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 8.11.2011

Репутация: 3
Всего: 3



Необходимо как можно быстрее упаковать динамический одномерный массив (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 тупо сделана в виде тройного цикла (пишу условно):
Код

For I := 1 to Imax do begin
     For J := 1 to Jmax do begin
           For K := 0 to Kmax-1 do begin
           ......
           Index := Imax*Jmax*K + Imax*(J-1) + I-1;
           Array1D[Index] := Array3D[I,J,K];
           ......
           end;
     end;
end; 

Аналогично - распаковка 3D ---> 1D массив.
Причём внешний цикл по i даже разбит на выч.потоки-нити (Delphi-Threads) на CPU. Всё равно: дооолго! Потому как подобная операция упаковки/распаковки выполняется тысячи раз.
Как можно ускорить подобную операцию? Как бы задать эквивалентность элементов 1D и 3D массивов... Типа: адреса сразу перед началом всего расчёта сопоставить. Или может как то через MemoryStream можно быстро копировать? Просто Move здесь не пройдёт - ведь как уже говорил, 3D - это массив указателей.
 smile 


Это сообщение отредактировал(а) Prok12 - 10.3.2016, 17:28
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1012 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.