2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 Re: Maple 9 и DLL на Visual С++ 2005 Express Edition
Сообщение06.12.2015, 17:31 


15/11/15
1080
И еще, все-таки, Maple у вас староват. Новые версии, по идее, должны лучше работать с многоядерныи процессором. Может и скорость бы возросла.
Конечно, нужна лицензия ) Может сочетание "Maple 2015 и DLL на Visual С++ 2005 Express Edition" даст вам нужную скорость.

 Профиль  
                  
 
 Re: Maple 9 и DLL на Visual С++ 2005 Express Edition
Сообщение07.12.2015, 19:30 
Заслуженный участник


12/07/07
4522
[Я почти не понимаю задачу, но всё же приведу несколько совершенно банальных мыслей. Думаю это всё Вам известно, но пусть будет для полноты темы.]

1. Если обращения к каждому из массивов (списков) происходит не много раз, то, возможно, для увеличения скорости лучше читать данные Maple из dll (т.е. иметь в dll функцию получения данных из Maple (передавать массивы), а не писать в дисковый файл и читать из файла). [Конечно, для продолжения работы с данными можно сохранять данные dll на диске, а при следующем запуске читать. Но если в дальнейшем данные не будут нужны, то немного выигрываем по времени.]

Если же обращение к данным происходит многократно, то можно и через дисковый файл. В этом случае данные лучше упорядочить — проверить принадлежит ли число некоторому массиву можно быстрее. Для сортировки можно написать простую консольную программу.

2. Если же работа с отсортированными массивами не подходит, а лучше перебирать элементы массива пока не будет найден искомый элемент или не пройден весь массив, то вместо scasw, я бы попробовал воспользоваться AVX или SSE (если процессор достаточно стар).

Я попробовал быстро набросать две функции: 1) c scasw, 2) с инструкциями SSE.
Если предположить, что массивы заведомо не будут содержать некоторое число (например, 0 или максимальное двухбайтовое), то функция c SSE может быть очень простой. При создании массива его размер делаем кранным восьми word. Если исходные данные не занимают весь массив, в свободные элементы пишем число, которое не может в нём встретиться и которое не будем в нём искать.

При поиске читаем по 8 слов и проверяем: нет ли среди них искомого числа. Если есть, то выходим из цикла и возвращаем истину (в приводимом ниже коде 1). Если же не находим, то повторяем чтение пока не пробежим весь массив.

код: [ скачать ] [ спрятать ]
Используется синтаксис ASM
// Функция на основе scasw
// rcx - длину массива в словах
// rdx - содержит искомое число
// r8 – адрес массива с данными
// rax – результат
    push    rdi
    mov     rdi,   r8
    mov     rax,   rdx
repne scasw
    je      @@Ok
    xor     rax,   rax
    jmp     @@Exit
@@Ok:
    mov     rax, 1
    jmp     @@Exit
@@Exit:
    pop rdi

код: [ скачать ] [ спрятать ]
Используется синтаксис ASM
// Функция на основе SSE
// rcx – содержит длину массива в словах
// rdx – содержит искомое число
// r8 – адрес массива с данными
// rax – результат
 mov      rax,  rdx
 shl      rax,  16
 or       rax,  rdx
 movq     xmm1, rax
 pcmpeqb  xmm2, xmm2   // generate mask 1
 pshufd   xmm1, xmm1, 00000000b  //
@@rep:
 movaps   xmm0, xmm1
 pcmpeqw  xmm0, [r8+rcx*2-16]
 ptest    xmm0, xmm2
 jnz      @@Ok
 sub      rcx,  8
 jnz      @@rep
 xor      rax,  rax  // Число не найдено в массиве
 jmp      @@Exit
@@Ok:                // Число найдено в массиве
 mov      rax,   1
@@Exit:

Я не оптимизировал функцию, но даже при таком черновом написании вторая функция выполняется быстрее первой более чем в 5 раз. Я сильно не проверял, поэтому стоит перепроверить, если использовать.
[Upd. (8.12.2015)] Времена выполнения сравнивались на Sandy Bridge, в системе была установлена достаточно медленная память DDR3 1333.[/Upd]

-- Пн 07.12.2015 18:36:47 --

Я писал для 64-битного кода, но для 32-битного будет практически то же самое, только надо позаботиться о выравнивании массивов на 128 бит и переименовать 64-биные регистры общего назначения на 32-битные.

 Профиль  
                  
 
 Re: Maple 9 и DLL на Visual С++ 2005 Express Edition
Сообщение08.12.2015, 06:09 


11/12/14
893
GAA в сообщении #1080355 писал(а):
1) c scasw


Замечу, что Intel до архитектуры Ivy Bridge не рекомендовал использовать строковые инструкции вообще, если вы хотели добиться скорости. На более старых архитектурах Intel цикл из mov/cmp был быстрее, не говоря уже о SSE. И только в Ivy Bridge они соптимизировали всё нормально. AMD сделал это годами ранее.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу Пред.  1, 2

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group