Форум программистов, компьютерный форум CyberForum.ru

Выравнивание при динамическом выделении памяти под массив - C++

Восстановить пароль Регистрация
 
Gorillych
14 / 14 / 1
Регистрация: 04.07.2013
Сообщений: 76
12.07.2013, 20:32     Выравнивание при динамическом выделении памяти под массив #1
Добрый вечер.
Для того, чтобы выделить память под массив динамически и выровнять указатель по 16 байтам, в разных ОС существуют разные функции:
C++
1
2
3
4
5
6
7
void * malloc_sse(const size_t size)
{
#if defined WIN32           // WIN32
    return (float*)_aligned_malloc(size, 16);
#elif defined __linux__     // Linux
    return (float*)memalign(16, size);
}
Можно ли это сделать крооссплатформенно, например, средствами С/С++11?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
12.07.2013, 21:08     Выравнивание при динамическом выделении памяти под массив #2
C++11 std::align()
Sayberix
0 / 0 / 0
Регистрация: 26.09.2016
Сообщений: 3
26.09.2016, 20:53     Выравнивание при динамическом выделении памяти под массив #3
Помогите написать оптимальный параметр выравнивания с помощью _alighed_malloc для создания двухмерного динамического массива:

C++
1
2
3
4
5
size_t arrRow, arrCol;
...
    int ** arr = (int **) _aligned_malloc((arrRow * sizeof (int *)), 16);
    for (i = 0; i < arrRow; ++i)
        arr[i] = (int *) _aligned_malloc((arrCol * sizeof (int)), 16);
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,340
26.09.2016, 22:19     Выравнивание при динамическом выделении памяти под массив #4
Sayberix,
а для чего тебе оптимальное выравнивание? SSE, AVX2 или еще чего?
Sayberix
0 / 0 / 0
Регистрация: 26.09.2016
Сообщений: 3
27.09.2016, 10:25     Выравнивание при динамическом выделении памяти под массив #5
Без SSE, AVX2. Мне просто интересно, как с учетом входных данных, в данном случае переменных arrRow, arrCol можно подобрать выравнивание под к-во элементов небольшого массива.
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,340
27.09.2016, 11:18     Выравнивание при динамическом выделении памяти под массив #6
Sayberix, зачем подбирать выравнивание, если оно тебе не нужно?
Ставь 1, не ошибешься.
Sayberix
0 / 0 / 0
Регистрация: 26.09.2016
Сообщений: 3
27.09.2016, 19:04     Выравнивание при динамическом выделении памяти под массив #7
nonedark2008
1. Что значит не нужно? Мне интересен сам подход, как вычислить выравнивание ввиду входных данных, например массив 20 x 20 элементов. Я понимаю что массив небольшой, но если например к нему необходимо обращаться программе много миллиардов раз для статистической выборки.
2. Меня интересует параметр выравнивания функции _alighed_malloc, он кратен степени двойки, в MSDN про это написано. Так что 1 тут не катит.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.09.2016, 19:42     Выравнивание при динамическом выделении памяти под массив
Еще ссылки по теме:

Создание исключения при динамическом выделении памяти C++
C++ Почему не вылетает ошибка при выделении памяти под динамический массив, размером 100 Гб?
Cin.getline() не работает при динамическом выделении памяти C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,340
27.09.2016, 19:42     Выравнивание при динамическом выделении памяти под массив #8
Цитата Сообщение от Sayberix Посмотреть сообщение
он кратен степени двойки... Так что 1 тут не катит.
http://www.cyberforum.ru/cgi-bin/latex.cgi?1=2^0
Цитата Сообщение от Sayberix Посмотреть сообщение
Мне интересен сам подход
Все зависит от компилятора и процессора.
Зачастую процессор читает блоками, выровненными по границе 32 байта (Это не всегда так). Если данные не выровнены по границе 32 байта, то читать приходится несколько раз (т.к. полезные данные попадают сразу в два блока). У процессора даже есть отдельные наборы инструкций для работы с выровненными данными и нет. Решение какой набор использовать либо принимает компилятор самостоятельно (если ты ему подашь информацию о том, какие данные у тебя выровнены, а какие нет), либо ты жестко их определяешь (Для этого обычно используют интринсики).

Собственно, где определенно важно выравнивание, так это в операциях SIMD.
Yandex
Объявления
27.09.2016, 19:42     Выравнивание при динамическом выделении памяти под массив
Ответ Создать тему
Опции темы

Текущее время: 23:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru