lysenkov Posted January 20, 2014 Share Posted January 20, 2014 Здравствуйте! Попал мне в руки другой пром. контроллер, похожий по аппаратным возможностям на W406-LX. Вот его процессор: /mnt/ufs/root # cat /proc/cpuinfoProcessor : ARM920T rev 0 (v4l) BogoMIPS : 89.79 Features : swp half CPU implementer : 0x41 CPU architecture: 4T CPU variant : 0x1 CPU part : 0x920 CPU revision : 0 А вот процессор MOXA W406: root@Moxa:~# cat /proc/cpuinfoProcessor: ARM920T rev 0 (v4l) BogoMIPS : 98.56 Features : swp half thumb crunch CPU implementer : 0x41 CPU architecture: 4T CPU variant : 0x1 CPU part : 0x920 CPU revision : 0 Cache type : write-back Cache clean : cp15 c7 ops Cache lockdown : format A Cache format : Harvard I size : 16384 I assoc : 64 I line length : 32 I sets : 8 D size : 16384 D assoc : 64 D line length : 32 D sets : 8 Как видно, процессоры очень похожи, как минимум у них одинаковое ядро. Тактовые частоты тоже одинаковые. Более того, у другого контроллера нет арифметического сопроцессора и медленнее память. Берем простую программу (можно сильно не изучать - простейшая числодробилка): #include <stdio.h> #include <time.h> #include <malloc.h> #include <string.h> int func(double* k) { *k -= 11234.32; return *k; } int main() { int i, j, n, m, z=0; long long l1, l2; double dt; struct timespec t1, t2; clock_gettime(CLOCK_MONOTONIC, &t1); for(i=0; i<1000; i++) for(j=0; j<1000; j++) { l1 = i*j; l2 = l1%(i+1); dt = l2+j; n = dt+i*(l2-123); m = n/12; l1 = func(&dt); z += l1-m; } clock_gettime(CLOCK_MONOTONIC, &t2); l1 = ((long long)t1.tv_sec)*1000+t1.tv_nsec/1000000; l2 = ((long long)t2.tv_sec)*1000+t2.tv_nsec/1000000; dt = l2-l1; printf("dt=%.3f sec, z=%d\n", dt/1000, z); return 0; } компилируем и запускаем. на W406-LX время выполнения ~30 секунд. На другом контроллере ~5,4 секунд. Различные ключи оптимизации у компилятора пробовал, разница все равно огромная. Версия gcc для W406 - 4.4.2, для другого контроллера - 4.3.2 Тесты я начал проводить после того, как заметил большую разницу в скорости работы прикладной программы. Вопрос: почему такая огромная разница в производительности? Link to comment
lysenkov Posted January 21, 2014 Author Share Posted January 21, 2014 Выяснил, что виной падения производительности являются операции с плавающей точкой. Если оставить только целочисленные вычисления, то процессоры идут "ноздря в ноздрю" Возникает следующий вопрос: почему soft-float сильно обгоняет "железный" математический сопроцессор? Прошивка не стоковая root@Moxa:~# kversionW406-LX version 1.2.10 В стоковой проблема: http://www.moxa.ru/f...entation-fault/ Link to comment
Agibalov Posted January 21, 2014 Share Posted January 21, 2014 Здравствуйте! Переслали вопрос разработчикам, ждём ответа. Link to comment
lysenkov Posted January 21, 2014 Author Share Posted January 21, 2014 Спасибо! Есть мысль: у компилятора есть всякие разные ключи :-) Компилятор понимает -mcpu=ep9312 -mfpu=maverick Эти опции, по идее, должны заставить компилятор сгенерить код, максимально подходящий под процессор и сопроцессор W406. Проблема в том, что все библиотеки скомпилированы без этих ключей и линкер, естественно, отказывается это собирать... Link to comment
Agibalov Posted January 27, 2014 Share Posted January 27, 2014 Разработчики просят несколько уточнений: Какая модель компьютера другой фирмы? Версия ToolChian - 3.1.2_Build_13082610? Какая версия прошивки? (команда “kversion –a”) Link to comment
lysenkov Posted January 27, 2014 Author Share Posted January 27, 2014 Другой компьютер: OWEN ПЛК323 (процессор производителя Atmel) Тулчейн: arm-linux_3.1.2_Build_13082610.sh Прошивка: root@Moxa:~# kversion -aW406-LX version 1.2.10 Build 13080709 Свежее у меня нет... Link to comment
lysenkov Posted February 27, 2014 Author Share Posted February 27, 2014 Здравствуйте! Есть ли новости по этой теме? Link to comment
Agibalov Posted March 3, 2014 Share Posted March 3, 2014 Здравствуйте! Разработчики пишут следующее: 1. Нужно использовать тулчейн с сайта. 2. Библиотеки с поддержкой плавающей запятой будут находиться в директории /usr/local/arm-linux/lib/gcc/arm-linux/4.2.1/soft-float/ 3. main.c нужно собрать со следующими параметрами: arm-linux-gcc ./main.c -o main -lrt -msoft-float 4. Т.к. glibc на контроллере старая, и там остутствует определение CLOCK_MONOTONIC, то необходимо добавить его в main.c: /* * The IDs of the various system clocks (for POSIX.1b interval timers): */ #define CLOCK_REALTIME 0 #define CLOCK_MONOTONIC 1 #define CLOCK_PROCESS_CPUTIME_ID 2 #define CLOCK_THREAD_CPUTIME_ID 3 После этого, программа должна выполняться быстрее, примерно за 5.1 с. Link to comment
lysenkov Posted March 4, 2014 Author Share Posted March 4, 2014 Опять возвращаемся к истокам, т.е. использованию стоковой прошивки и неиспользованию арифметического сопроцессора для обхода этой проблемы: http://old.moxa.ru/f...mentation-fault ? А хотелось заставить работать сопроцессор быстро и без глюков... Link to comment
lysenkov Posted September 8, 2014 Author Share Posted September 8, 2014 Здравствуйте! Разработчики пишут следующее: 1. Нужно использовать тулчейн с сайта. 2. Библиотеки с поддержкой плавающей запятой будут находиться в директории /usr/local/arm-linux/lib/gcc/arm-linux/4.2.1/soft-float/ 3. main.c нужно собрать со следующими параметрами: arm-linux-gcc ./main.c -o main -lrt -msoft-float 4. Т.к. glibc на контроллере старая, и там остутствует определение CLOCK_MONOTONIC, то необходимо добавить его в main.c: /* * The IDs of the various system clocks (for POSIX.1b interval timers): */ #define CLOCK_REALTIME 0 #define CLOCK_MONOTONIC 1 #define CLOCK_PROCESS_CPUTIME_ID 2 #define CLOCK_THREAD_CPUTIME_ID 3 После этого, программа должна выполняться быстрее, примерно за 5.1 с. Здравствуйте! Я уже почти согласен использовать soft-float, т. к. он действительно в разы быстрее работает, но в стоковой прошивке отсутствует поддержка CLOCK_MONOTONIC и определение его "вручную" никак не добавляет его поддержки в библиотеках - при его использовании функция clock_gettime() возвращает ошибку. К сожалению, для измерения интервалов времени в высокой разрешающей способностью я замены найти не смог. Прошивка на ftp есть уже 1.2.12, только что в ней изменилось - неизвестно... Link to comment
Agibalov Posted September 11, 2014 Share Posted September 11, 2014 Пришлите, пожалуйста, программу на которой проявляется проблема и текст сообщения об ошибке. Link to comment
lysenkov Posted September 11, 2014 Author Share Posted September 11, 2014 Пришлите, пожалуйста, программу на которой проявляется проблема и текст сообщения об ошибке. #include <time.h> #include <errno.h> #include <stdio.h> #include <string.h> #define CLOCK_MONOTONIC 1 int main() { struct timespec t1; if(clock_gettime(CLOCK_MONOTONIC, &t1) < 0) printf("clock_gettime() error: %s\n", strerror(errno)); else printf("clock_gettime() ok\n"); return 0; } Результат выполнения - clock_gettime() error: Invalid argument Библиотеки стоковой прошивки собраны без определения CLOCK_MONOTONIC. Если мы его определяем сами, то в библиотеках поддержка не появляется. Резюмирую: I. в стоковой прошивке существует 2 проблемы: 1) компилятор неверно формирует команды сопроцессора из-за чего портится стек. Проблему можно обойти использованием эмулятора сопроцессора (soft-float). 2) библиотеки и, возможно, ядро собраны без определения CLOCK_MONOTONIC, из-за чего невозможно (или я не знаю как) измерять интервалы времени с высокой разрешающей способностью; II. в прошивке 1.2.10 обе эти проблемы решены, но появилась другая - ужасно медленно работают операции с плавающей точкой, выполняет их "железный" сопроцессор. Проблему можно было бы обойти, используя soft-float, но в прошивке 1.2.10 и в соответствующем тулчейне библиотеки soft-float напрочь отсутствуют. Я вижу два пути обхода/решения проблем: I. обход: сделать прошивку на основе 1.2.10, но включить в нее и в соотв. тулчейн библиотеки soft-float и даже собрать тулчейн, чтобы он использовал soft-float по умолчанию; II. решение: заставить таки работать железный математический сопроцессор с нормальной производительностью. Зачем-то он встроен в W406? Может (должен) он умеет работать быстрее эмуляции, а не 10 раз медленнее, как сейчас. P.S. Готов ответить на Ваши дополнительные вопросы, если они будут. P.P.S. тут лежит компилятор http://arm.cirrus.com/files/tools/arm-linux-gcc-4.1.1-920t.tar.bz2, который использует математический сопроцессор, не имеет ошибки, приводящей к порче стека при использовании сопроцессора и в котором есть CLOCK_MONOTONIC Только библиотеки его приходится подпихивать. Тестовая программа из первого сообщения выполняется за 4.04 сек. Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now