![]() |
|
|
![]()
|
|
| setnull |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 3.7.2007 Репутация: нет Всего: 1 |
Все здравствуйте!
Подскажите, кто знает, существует ли возможность произвести опреацию, к примеру, для двух int32, яваляющуюся попарным произведение четырех их байт, одним махом, не разбивая на байты, с результатом получается int64? Спасибо!!! Это сообщение отредактировал(а) setnull - 26.1.2012, 11:53 |
|||
|
||||
| _Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
Так это, надо понимать, от языка зависит. В каком-то, наверное, можно.
Сам я на C++ никогда не писал, но, вроде, там можно переопределять арифметические операторы. Вот переопределить и дальше считать одним махом. -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
| setnull |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 3.7.2007 Репутация: нет Всего: 1 |
Речь пока идет без привязки к конкретному языку.
Исходя из того, что есть операции низкого уровня над 4b целым (сдвиги, сложения, умножения, побитовые) возможно ли реализовать алгоритм быстрого умножения его четырех байтов отдельно? Организовать конечно можно пошаговые сложения, слежения за переполнениями и.тд. Интересует существование именно быстрого алгоритма, выигрывающего в производительности за счет сведения четырех операций в один поток. Или такое в принципе невозможно\неоправданно? Спасибо! Это сообщение отредактировал(а) setnull - 26.1.2012, 13:00 |
|||
|
||||
| Pavia |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
setnull,
Как, бы вам с вопросом надо определиться. Что вы хотите?
Как-то у вас русский язык хромает. ДА и мысль осталась не ясна. Советую посмотреть лекцию. http://www.intuit.ru/department/supercomputing/baseraspp/ И это посмотри. http://ru.wikipedia.org/wiki/Классификация по Флинну
Это сообщение отредактировал(а) Pavia - 26.1.2012, 18:52 |
||||||
|
|||||||
| setnull |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 3.7.2007 Репутация: нет Всего: 1 |
Лекция заинтересовала (вступление), обязательно вернусь к ней!!!
Про классификацию не совсем понял, в каком ребре соприкосновение с задачей... Изложил задачу таки не совсем ясно... Программирование последовательное (пока что Возможно ли реализовать с помощью целочисленных операций над двумя целыми числами длинной в 4б, попарное умножение их байтов поотдельности. например а = 0х01020304 б = 0х00020201 результат операции а # б= 0х00040604 (или пускай с поправкой на размерность 0х00000004000060004) но при этом чтоб алгоритм заключался не в том, чтоб с максой 0хff обращаться к каждому байту, и разложить на 4 операции умножения, а именно производя операции над единым целым в 4б. |
|||
|
||||
| Pavia |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
пример 1.
Пример 2. Тоже самое только дугая запись. В с/с++ можно сделаь аналогично через struct union.
пример 3
В третьем примере, код будет работать 3 цикла умножения. А во втором и первом примерах 1 и 2 умножения не имеют зависимости поэтому они могут выполниться параллельно. Поэтому скорость первого и вторго примера 2 цикла умножения. В третьем примере компилятор может распараллелить, но на практике думается делать он это не будет. Параллельность зависит от процессора что-то можно распараллелить что-то нельзя. Вполне возможно что в процессорах с VLMW или RISC процессорах можно записать 3 умножения одной командой. На x86 точно нет такой команды, только в 2 команды. Сначала за раз 2 умножения потом еще одно. Даже Intel и Microsoft специально добавили в сови компиляторы С/с++ наборы instrics которые реализуют низкоуровневые SIMD команды CPU в виде высокоуровневых функций. SIMD - расшифровывается как, ода инструкция много данных. За частую при таком подходе данные обрабатываться параллельно, за счёт этого имеем прирост в производительности. А ещё процессоры интел называют мульти скалярными. Это архитектура MIMD(мноо инструкций много данных) Процессор может выполнять команды которые не имеют зависимости по данным параллельно. Так что второй и первый пример хотя и имеют 3 умножени, но будут выполняться по скорости как 2 последовательных умножения. Зачем нужен SIMD когда есть MIMD? На SIMD обычно пишет челове программист и он способен распаролелить код лучше чем это сделает компилятор+процесор. SIMD выступает в роли помощника, подсказывая процессору над какими данными можно вести код паролельно. В процессор трудно вставить крутой алгоритм анлиза, который бы паролелил днные поэтому он не такой умный. К SIMD относятся процессоры с наборами команд MMX,SSE, SSE2 и тд. GPU обычно тоже выполняют одну команду над 4 компонентами цвета одного пикселя и над 4 пикселями. В некоторых ARM(практически во всех) тоже есть свои наборы команд Neon. И в других процессорах тоже есть свои инструкции. Прирост скорости достигается за счёт параллельности. А вот способы для достижения параллельности бывают разные. |
||||||
|
|||||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |