Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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 байт.



Страницы: 1 вся ветка

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

Наверх





Память: 0.46 MB
Время: 0.002 c
1-28499
nevidimie
2001-12-23 13:44
2002.01.10
Обработка Memo


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


14-28534
Dim
2001-11-13 07:25
2002.01.10
Братья и сестры. Очередная пирамида или ......?


3-28410
Don
2001-12-07 16:01
2002.01.10
Вывод текста в заголовке StringGrid-а вертикально


3-28417
Ermaks
2001-12-09 00:36
2002.01.10
MS SQLDMO Type Library





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский