Есть большой массив, элементы по 16 бит = 2 байта. Хочу на асме сделать ОПТИМИЗИРОВАННУЮ ФУНКЦИЮ, которая бы считывала значения из массива и записывала бы в другой! По каким порция эффективнее всего считвать из памяти и записывать в память? т.е. можно считать как сразу 64 бита можно последовательно хоть 8 раз по 64 бита, можно считать сразу 128 бит, можно последоватьельно считать 128 бит, можно по 32 бита считывать, такая же картина и с записью в память.
Turkish Может быть есть круче!! Дело в том я хочу не только копировать а преобразовывать из целочисленного знакового в плавующие FLOAT!! Я знаю 3 способа: 1) SSE + SSE2 сразу по 4 значения в регисре!! 2) Сопроцессор с синхронизацией FWAIT 3) movzx + SSE
emergenter В раздел Документы лень посмотреть? Using Block Prefetch for Optimized Memory Performance by Mike Wall Пример на фасме я уже раз пять кидал... Turkish > Я не знаю, что под понимать под словами , но если порядок - Мег, то шина памяти тормозит сильно. Хотя на PIV вроде movsd ускорен аппаратно - не знаю, провереть негде :-(
Люди!!! Help!!! Кто-нибудь знает более-менее эффективный алгоритм перемножения двух матриц с числами типа float при помощи SSE-инструкций. А то использовать стандартные инструкции сопроцессора как-то не очень хорошо, когда проц реализует хоть и примитивный, но все-таки SIMD. В четыре раза быстрее может получиться!
phoenix это тока кажется на практике в 4 раза быстрее ОЧЕНЬ ТЯЖЕЛО ПОЛУЧИТЬ РЕЗУЛЬТАТ!! Надо долго и упорно изучать доки типа таких как S_T_A_S_ предложил к чтению!!! Я думаю практически никто не сможет похвастаться приростом в 4 раза переписав все на SSE!! У меня получалось только в 1,5 - 2 раза быстрее!!
Проблема, собственно говоря, не в том, даст ли SSE увеличение производительности в четыре раза (и так понятно, что не даст в силу различных издержек). Проблема в том, даст ли SSE хоть какое-то увеличение производительности. Я разрабатываю библиотеку для быстрого выполнения операций над векторами и матрицами, которая потом будет использоваться для моделирования нейронных сетей. Понятно, что даже незначительное увеличение скорости работы отдельных компонентов может ощутимо сократить время обучения сети. Проблемой при перемножении двух матриц является то, что элементы одной мы должны брать из строки, а другой - из столбца. Соответсвенно, если матрица храниться в памяти по строкам, то адреса элементом в строке первой матрицы непосредственно следуют друг за другом, а адреса элементов второй матрицы - с определенным шагом. Выходом из сложившейся ситуации могло бы стать транспонирование второй матрицы или одновременное хранение нормальной матрицы и ее транспонированного варианта. Но в первом случае это приведет к перераходу памяти и затратам времени на операцию транспонирования, а во втором к затратам времени на операцию обновления значений элементов, что так же крайне нежелательно. Идеальным выходом была бы какая-нибудь хитрая манипуляция с адресами. Может кто-нибудь знает?
У меня где-то были такие библы готовые, только они почему-то под AMD 3DNow! и для IA-64 На intel.com afaik можно найти под SSE.
phoenix Если имеется ввиду проблема кэширования данных, то имеет смысл использовать "space filling curves"(русского термина к сожалению не знаю). Например здесь: Recursive Array Layouts and Fast Parallel Matrix Multiplication ну и google соответственно. А чем не нравятся уже имеющиеся(типа linpack,lapack etc.)?
phoenix Linpack и Lapack - библиотеки для решения линейных систем уравнений для всеможных матриц. Linpack уже немного устарела, но всё еще используется во всяких бенчмарках. Если же тебя интересуют отдельные операции с матрицами и векторами, то смотри BLAS 1,2 и 3. Общий код есть на netlib.org: http://www.netlib.org/lapack/ http://www.netlib.org/blas/ Оптимированные под определенный процессор версии нужно искать на странице производителя.Например Intel: http://developer.intel.com/software/products/mkl/features/lin_alg.htm Часто входят в комплект поставки математических пакетов, я в свое время использовал Linpack из Matlab. P.S. Написаны на Fortran 77, как и практически вся серьёзная математика.