Главная страница
    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.003 c
1-28452
Lis
2001-12-20 14:51
2002.01.10
MemoryManager & MMX


1-28485
AVALLOGIGS
2001-12-22 13:27
2002.01.10
HELP ME!!!!!!!!!!!!!!


4-28555
Di_wind
2001-11-07 19:02
2002.01.10
Процесс


3-28438
SDS
2001-12-09 21:36
2002.01.10
Требуется помощь


14-28538
Внук
2001-11-12 17:09
2002.01.10
Internet Explorer 6.0





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский