Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.10;
Скачать: [xml.tar.bz2];




Вниз

MemoryManager & MMX 


Lis   (2001-12-20 14:51) [0]

Как заставить MemoryManager выравнивать блоки памяти по 8 бит?



Владислав   (2001-12-20 15:08) [1]

Используй VirtualAlloc из API.



Lis   (2001-12-20 18:56) [2]

Спасибо, но я спрашивал о другом. Хотелось бы заставить заниматься выравниванием именно менеджер, чтобы, например, использовать динамические массивы.



Владислав   (2001-12-21 06:48) [3]

А какая разница? VirtualAlloc выравнивает аж на 64 kB.



MBo   (2001-12-21 06:59) [4]

а для какой цели это нужно?
может, что-нибудь примитивное подойдет
типа использования массива записей размера, кратного 8 байт или даже
array of double
и приведения типов



Владислав   (2001-12-21 09:12) [5]

> MBo © (21.12.01 06:59)

...использования массива записей размера, кратного 8 байт или даже array of double...

А это разве поможет для выравнивания?



Green   (2001-12-21 11:33) [6]

Интересно, а что мешает использовать динамические массивы однобайтовых величин, если каждый элемент не выровнен на границу слова (двойного слова и т. д.)????



Lis   (2001-12-21 14:06) [7]

Нужно это для того, чтобы быстрее работали команды MMX (у меня на быстром преобразовании Фурье без выравнивания теряется 30%). Я сейчас беру память GetMem"ом и ручками подправляю пойнтер. Хотелось бы избавиться от этой кривизны.



Lis   (2001-12-21 16:05) [8]

Поясняю своё решение:

function GetQuadMem(var Mem: Pointer; Size: Integer): Pointer;
begin
GetMem(Mem, Size + 4);
if (Cardinal(Mem) and 4) = 0 then
Result := Mem
else
Result := Pointer(Cardinal(Mem) + 4);
end;

qP := GetQuadMem(mP, 8*N);
// работаем с qP
FreeMem(mP);

Недостатки такого решения:
1. На каждую переменную приходится хранить 2 пойнтера;
2. Динамические массивы не выравниваются.

Попытка аналогичным способом подменить MemoryManager у меня не прошла, посему 2 более конкретных вопроса:
1. MemoryManager один на всю программу или у каждой нитки свой?
2. Какой формат у заголовка блока памяти?



Digitman   (2001-12-21 16:59) [9]

MemoryManager, который Борланд реализует по-умолчанию, выделяет блоки памяти, выравненные на границу двойного слова (DWORD). Динамические массивы используют тот же менджер памяти, а, значит, такде выравниваются на ту же границу. Так что придумывать ничего и не надо.
Единственное, что наводит сомнения - префикс Quad в твоем коде. Вероятно, тебе все же требуется выравнивание не по границе DWORD, а по границе QWORD. Тогда, конечно же, стандартный менеджер не подходит.



Lis   (2001-12-21 18:38) [10]

Я извиняюсь за опечатку в изначальном вопросе. Конечно требуется выравнивание на 8 байт.




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.10;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.015 c
3-28420           Ross                  2001-12-08 21:58  2002.01.10  
Проблема со шрифтами


1-28463           Sergey Karagodin      2001-12-21 21:54  2002.01.10  
Как выводить длинные строки?


6-28524           Алексей Штыков        2001-10-16 14:38  2002.01.10  
Как втихую проверить обновления (любые) с сервера.?


14-28540          savva                 2001-11-15 12:28  2002.01.10  
Поздравляем сегодня человека с ником Jey - у него сегодня день ВАРЕНЬЯ!!! (и подружнее товариши:)))


14-28536          tovSuhov              2001-11-16 15:39  2002.01.10  
E-mail автоответчик