Поиск:

Ответ в темуСоздание новой темы Создание опроса
> mingw, как задать выравнивание для malloc? 
:(
    Опции темы
victor79
Дата 5.4.2009, 03:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист
*


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

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



программа компилируемая на mingw, по умолчанию malloc выдает выравнивание под 8 байт. А мне для sse нужно 16, может кто знает, есть ли опция такая для компилятора?
PM MAIL WWW   Вверх
MAKCim
Дата 5.4.2009, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



компилятор здесь не причем


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
victor79
Дата 5.4.2009, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист
*


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

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



тут два варианта, либо используется malloc системы виндовс, тогда на него можно воздействовать только если есть такое в винапи, или используется внутренний, тогда возможно по дефайну или по установке переменной. И вопрос есть ли такое, и где его искать? И можно потратить часы на поиск ответа, или вдруг кто уже знает, и можно не тратить на время на поиск ответа.
PM MAIL WWW   Вверх
Alexeis
Дата 5.4.2009, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



  Можно выделить больше памяти и выравнять самому.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Lazin
Дата 5.4.2009, 19:13 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



есть ф-я VirtualAlloc, с ее помощью можно написать свою версию malloc
PM MAIL Skype GTalk   Вверх
GoldFinch
Дата 5.4.2009, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

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



Цитата(Lazin @  5.4.2009,  20:13 Найти цитируемый пост)
есть ф-я VirtualAlloc, с ее помощью можно написать свою версию malloc 

VirtualAlloc выделяет минимум страницу памяти, 4Кб

для выделения в хипе надо использовать HeapAlloc, который впрочем, и используется стандартным malloc

Добавлено через 3 минуты и 16 секунд
для получения выровненных адресов в хипе видимо следует создать свой хип, и выделять там только куски памяти кратные 16, тогда каждый начальный адрес тоже будет кратен 16

либо вообще отказаться от системного хипа и брать память в заранее выделенном массиве
PM MAIL ICQ   Вверх
Alexeis
Дата 5.4.2009, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(GoldFinch @  5.4.2009,  18:41 Найти цитируемый пост)
для получения выровненных адресов в хипе видимо следует создать свой хип, и выделять там только куски памяти кратные 16, тогда каждый начальный адрес тоже будет кратен 16

  А как же список блоков? malloc в дебаговой версии выделяет на 10 байт больше для каждого выделения для системной информации, в дебаговой 36 байт сверх. Если при каждой операции выделить памяти на 15 байт больше чем нада, то такой адрес будет гарантированно выравненным, а если известно что malloc выравнивает на границу 8ми байт, то достаточно выделить на 8 байт больше, чтобы прибавить их к указателю в случае если он не выравнен на 16 байт. Но в таком случае придется написать свою функцию освобождения таких блоков, чтобы перед удалением провести обратное смещение на 8 байт.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
GoldFinch
Дата 5.4.2009, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

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



Alexeis, это стандартный маллок чтото выделяет сверх того что ему заказали, а если написать свой этого не будет
Код

inline void* operator new(size_t cb) {
    return (void*)HeapAlloc(myHeap, 0, cb);
};
inline void operator delete(void* ptr) {
    HeapFree(myHeap, 0, ptr);
};

это для С++ но для С принцип тот же

Это сообщение отредактировал(а) GoldFinch - 5.4.2009, 20:12
PM MAIL ICQ   Вверх
Alexeis
Дата 5.4.2009, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



GoldFinch, и что? Если выделить несколько раз по 16 байт, то будут адреса будут смещены на 16 строго байт? не на 26 или 72?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
GoldFinch
Дата 5.4.2009, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

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



да, действительно, кратность 16 не получается
Код

#include <windows.h> 
#pragma comment(linker,"/ENTRY:main")

int main() {
    HANDLE h=GetProcessHeap();
    HeapAlloc(h, 0, 16);
    HeapAlloc(h, 0, 16);
    HeapAlloc(h, 0, 16);
    HeapAlloc(h, 0, 16);
    HeapAlloc(h, 0, 16);
};

PM MAIL ICQ   Вверх
Alexeis
Дата 5.4.2009, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



GoldFinch, HeapAlloc это куча, а все кучи работают сходно, они хранят информацию о блоке памяти в самом блоке. Так эффективнее. Иначе пришлось бы выделять 2 блока памяти один под описатель и один под саму память.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
nickless
Дата 7.4.2009, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

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



Есть еще posix_memalign

Добавлено через 2 минуты и 26 секунд
Мы её кстати как раз для SSE2 и использовали


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | GNU toolchain | Следующая тема »


 




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


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

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