Jump to content
Форум по продукции MOXA

W406-LX производительность процессора


Recommended Posts

Здравствуйте!

 

Попал мне в руки другой пром. контроллер, похожий по аппаратным возможностям на W406-LX.

Вот его процессор:

/mnt/ufs/root # cat /proc/cpuinfo

Processor : 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/cpuinfo

Processor: 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

Выяснил, что виной падения производительности являются операции с плавающей точкой.

Если оставить только целочисленные вычисления, то процессоры идут "ноздря в ноздрю" :)

Возникает следующий вопрос: почему soft-float сильно обгоняет "железный" математический сопроцессор?

Прошивка не стоковая

root@Moxa:~# kversion

W406-LX version 1.2.10

В стоковой проблема: http://www.moxa.ru/f...entation-fault/

Link to comment

Спасибо!

 

Есть мысль: у компилятора есть всякие разные ключи :-)

Компилятор понимает -mcpu=ep9312 -mfpu=maverick

Эти опции, по идее, должны заставить компилятор сгенерить код, максимально подходящий под процессор и сопроцессор W406.

Проблема в том, что все библиотеки скомпилированы без этих ключей и линкер, естественно, отказывается это собирать...

Link to comment

Разработчики просят несколько уточнений:

Какая модель компьютера другой фирмы?

Версия ToolChian - 3.1.2_Build_13082610?

Какая версия прошивки? (команда “kversion –a”)

Link to comment

Другой компьютер: OWEN ПЛК323 (процессор производителя Atmel)

Тулчейн: arm-linux_3.1.2_Build_13082610.sh

Прошивка:

root@Moxa:~# kversion -a

W406-LX version 1.2.10 Build 13080709

Свежее у меня нет...

Link to comment
  • 5 weeks later...

Здравствуйте!

 

Разработчики пишут следующее:

 

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

Опять возвращаемся к истокам, т.е. использованию стоковой прошивки и неиспользованию арифметического сопроцессора для обхода этой проблемы:

http://old.moxa.ru/f...mentation-fault ?

 

А хотелось заставить работать сопроцессор быстро и без глюков...

Link to comment
  • 6 months later...

Здравствуйте!

 

Разработчики пишут следующее:

 

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

Пришлите, пожалуйста, программу на которой проявляется проблема и текст сообщения об ошибке.

#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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...