Чтение и запись в память

Тема в разделе "WASM.A&O", создана пользователем emergenter, 27 дек 2004.

  1. emergenter

    emergenter New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2003
    Сообщения:
    16
    Адрес:
    СПб
    Есть большой массив, элементы по 16 бит = 2 байта.

    Хочу на асме сделать ОПТИМИЗИРОВАННУЮ ФУНКЦИЮ, которая бы считывала значения из массива и записывала бы в другой! По каким порция эффективнее всего считвать из памяти и записывать в память?



    т.е. можно считать как сразу 64 бита можно последовательно хоть 8 раз по 64 бита, можно считать сразу 128 бит, можно последоватьельно считать 128 бит, можно по 32 бита считывать, такая же картина и с записью в память.
     
  2. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    volodya уже давно документ от AMD положил на сайт.

    Там всё расписано.
     
  3. emergenter

    emergenter New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2003
    Сообщения:
    16
    Адрес:
    СПб
    Так вроде что подходит для AMD не подходит для P4? ведь так?
     
  4. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Сказки!
     
  5. emergenter

    emergenter New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2003
    Сообщения:
    16
    Адрес:
    СПб
    ОК!!!!! А ссылочку на статейку можно?
     
  6. Turkish

    Turkish New Member

    Публикаций:
    0
    Регистрация:
    25 окт 2004
    Сообщения:
    80
    Адрес:
    Russia
    А rep movsd не рулит?
     
  7. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    См. Агнер Фог, гл. 19.6 Moving blocks of data (All processors)
     
  8. emergenter

    emergenter New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2003
    Сообщения:
    16
    Адрес:
    СПб
    Turkish

    Может быть есть круче!! Дело в том я хочу не только копировать а преобразовывать из целочисленного знакового в плавующие FLOAT!! Я знаю 3 способа:

    1) SSE + SSE2 сразу по 4 значения в регисре!!

    2) Сопроцессор с синхронизацией FWAIT

    3) movzx + SSE
     
  9. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    emergenter



    В раздел Документы лень посмотреть?

    Using Block Prefetch for Optimized Memory Performance by Mike Wall

    Пример на фасме я уже раз пять кидал...





    Turkish >




    Я не знаю, что под понимать под словами
    , но если порядок - Мег, то шина памяти тормозит сильно. Хотя на PIV вроде movsd ускорен аппаратно - не знаю, провереть негде :-(
     
  10. phoenix

    phoenix New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    4
    Адрес:
    Russia
    Люди!!! Help!!! Кто-нибудь знает более-менее эффективный алгоритм перемножения двух матриц с числами типа float при помощи SSE-инструкций. А то использовать стандартные инструкции сопроцессора как-то не очень хорошо, когда проц реализует хоть и примитивный, но все-таки SIMD. В четыре раза быстрее может получиться!
     
  11. emergenter

    emergenter New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2003
    Сообщения:
    16
    Адрес:
    СПб
    phoenix

    это тока кажется на практике в 4 раза быстрее ОЧЕНЬ ТЯЖЕЛО ПОЛУЧИТЬ РЕЗУЛЬТАТ!! Надо долго и упорно изучать доки типа таких как S_T_A_S_ предложил к чтению!!! Я думаю практически никто не сможет похвастаться приростом в 4 раза переписав все на SSE!! У меня получалось только в 1,5 - 2 раза быстрее!!
     
  12. phoenix

    phoenix New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    4
    Адрес:
    Russia
    Проблема, собственно говоря, не в том, даст ли SSE увеличение производительности в четыре раза (и так понятно, что не даст в силу различных издержек). Проблема в том, даст ли SSE хоть какое-то увеличение производительности. Я разрабатываю библиотеку для быстрого выполнения операций над векторами и матрицами, которая потом будет использоваться для моделирования нейронных сетей. Понятно, что даже незначительное увеличение скорости работы отдельных компонентов может ощутимо сократить время обучения сети.



    Проблемой при перемножении двух матриц является то, что элементы одной мы должны брать из строки, а другой - из столбца. Соответсвенно, если матрица храниться в памяти по строкам, то адреса элементом в строке первой матрицы непосредственно следуют друг за другом, а адреса элементов второй матрицы - с определенным шагом. Выходом из сложившейся ситуации могло бы стать транспонирование второй матрицы или одновременное хранение нормальной матрицы и ее транспонированного варианта. Но в первом случае это приведет к перераходу памяти и затратам времени на операцию транспонирования, а во втором к затратам времени на операцию обновления значений элементов, что так же крайне нежелательно. Идеальным выходом была бы какая-нибудь хитрая манипуляция с адресами. Может кто-нибудь знает?
     
  13. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    У меня где-то были такие библы готовые, только они почему-то под AMD 3DNow! и для IA-64 :)

    На intel.com afaik можно найти под SSE.
     
  14. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    phoenix





    Если имеется ввиду проблема кэширования данных, то имеет смысл использовать "space filling curves"(русского термина к сожалению не знаю). Например здесь: Recursive Array Layouts and Fast Parallel Matrix Multiplication ну и google соответственно.







    А чем не нравятся уже имеющиеся(типа linpack,lapack etc.)?
     
  15. phoenix

    phoenix New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    4
    Адрес:
    Russia
    А ты думаешь, что я знаю где они живут? Буду очень признателен, если дашь ссылку.
     
  16. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    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, как и практически вся серьёзная математика.
     
  17. Maggot

    Maggot New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2005
    Сообщения:
    17


    http://www.itanium.ru/design/pentiumiii/sml/24504501.pdf