eXeL@B —› Программирование —› fast_copy и fast_xor |
Посл.ответ | Сообщение |
|
Создано: 19 апреля 2012 22:48 · Личное сообщение · #1 Приветствую сишников! Есть вот такой код (написан мной): Code:
На вход подаются две таблицы по 256 байт. Требуется запилить код, который как можно быстрее суммирует их между собой (понятное дело логическое сложние по модулю 2). Правильно ли это решение с точки зрения скорости работы? Или обычный xor будет быстрее? Есть и еще одна задача, инициализация таблицы из rainbow таблицы, но об этом позже. |
|
Создано: 19 апреля 2012 22:55 · Личное сообщение · #2 |
|
Создано: 19 апреля 2012 22:59 · Личное сообщение · #3 |
|
Создано: 19 апреля 2012 23:02 · Личное сообщение · #4 |
|
Создано: 19 апреля 2012 23:24 · Личное сообщение · #5 r_e Что-то типа такого? Code:
|
|
Создано: 20 апреля 2012 00:45 · Личное сообщение · #6 Теперь fast_copy: Code:
Код явно плохой, но интересно услышать в какую сторону идти с позиции оптимизации. Дело в том, что массив случайных чисел представляет собой циклическую группу. Хранится она в виде массива 0, rand(0), rand(rand(0)), ... Всего 100 000 000 значений. Нам нужно 256 последовательных чисел этого массива. Если же наш индекс указывает ближе к концу этого массива, получается что надо скопировать 256 - N чисел с конца массива и N чисел с начала массива. Таким образом имеем неизвестный размер блока (N может быть ноль в хорошем случае, или чем угодно в плохом). Какие мысли? |
|
Создано: 20 апреля 2012 01:04 · Поправил: int_256 · Личное сообщение · #7 memcpy в последних реализациях использует xmm регистры |
|
Создано: 20 апреля 2012 01:11 · Личное сообщение · #8 |
|
Создано: 20 апреля 2012 01:30 · Личное сообщение · #9 |
|
Создано: 20 апреля 2012 01:54 · Личное сообщение · #10 ajax Хороший код, только я задолбаюсь это в человеческий вид (в смысле "красивый" С) переводить. Но в принципе юзабельно. Логически получается, что чуть ли не единственный разумный вариант. Базируясь на размере блока определять switch'ом какую последовательность инструкций использовать. Учитывая, что максимальный размер блока не такой большой (256 двойных слов), можно переделать под конкретный рассматриваемый случай с развертыванием циклов. Хотя конечно, если кто знает готовый аналог на сях, хочется использовать его, чтобы не изобретать велосипед. Задача очень тривиальная. |
|
Создано: 20 апреля 2012 02:38 · Личное сообщение · #11 Такой вариант еще сделал (на основе Duff's device): Code:
P.S. Не проверял ни правильность, ни скорость... Как проверю, отпишусь. |
|
Создано: 20 апреля 2012 02:58 · Поправил: reversecode · Личное сообщение · #12 вагон http://www.gamedev.net/topic/474646-memcpy-using-sse-in-linux/ http://files.rsdn.ru/23380/AMD_block_prefetch_paper.pdf http://www.gamedev.ru/code/forum/?id=17661&page=2 http://exelab.ru/f/action=vthread&forum=6&topic=15816&page=0 http://www.gamedev.ru/code/forum/?id=62849&page=2 и еще докучи http://www.hackchina.com/en/r/201332/dmemcpy.cpp__html https://community.cablelabs.com/svn/OCAPRI/trunk/ri/RI_Stack/thirdparty/DirectFB/src/misc/memcpy.c а еще лучше компилять Intel C++ Compiler, он умеет оптимизировать |
|
Создано: 20 апреля 2012 03:20 · Личное сообщение · #13 |
|
Создано: 20 апреля 2012 09:03 · Личное сообщение · #14 |
|
Создано: 20 апреля 2012 09:23 · Личное сообщение · #15 |
|
Создано: 20 апреля 2012 10:31 · Поправил: neomant · Личное сообщение · #16 |
|
Создано: 20 апреля 2012 10:31 · Личное сообщение · #17 |
|
Создано: 20 апреля 2012 10:33 · Личное сообщение · #18 |
|
Создано: 20 апреля 2012 12:12 · Личное сообщение · #19 |
|
Создано: 20 апреля 2012 12:27 · Личное сообщение · #20 |
|
Создано: 20 апреля 2012 14:03 · Личное сообщение · #21 drone пишет: IIRC, были доки от amd по поводу оптимизации, так вот там обсуждались такие алгоритмы reversecode пишет: http://files.rsdn.ru/23380/AMD_block_prefetch_paper.pdf | Сообщение посчитали полезным: Dart Sergius |
|
Создано: 22 апреля 2012 06:43 · Личное сообщение · #22 |
eXeL@B —› Программирование —› fast_copy и fast_xor |