Перейти к содержанию
    

Allwinner A13 V.S. OMAP-L138. Кто производительнее?

Добрый день.

 

Сейчас плотно занимаюсь оллвиннером A13, а на подходе плата с OMAP-L138 @456 МГц.  A13 работает на частоте 960 МГц, память на 408МГц. Плата Olinuxino-A13.

 

Запустил тест памяти, который работал на C6745.  На A13 тест идёт 4 минуты, на C6745 тест памяти 5 минут.  У C6745 память SDRAM 16 bit, 152 МГц. У A13 DDR3, 408 МГц, шина тоже 16 бит.

 

Я ожидал бОльшего: на A13 тест должен был субъективно быть в 3-4 раза быстрее.  На практике вышло, что С6745 456/152 чуть-уступает A13 960/408.

Вопрос - почему?

 

В A13 кеширование и MMU включены.

 

Компилятор GCC последней версии (9-я, тулчейн arm-none-eabi). 

 

Так кто же производительнее будет на обычном управляющем коде?

 

P.S. Тестировались только первые 64 МБ.  Маблица MMU лежит в последнем мегабайте DDR.

 

Код тестилки:

Spoiler

//Вызов кода в main() ---------------------------------------------------

#include "MemTest.h"

//  ...
  
if(TestSDRAM8())if(TestSDRAM16())if(TestSDRAM32())if(TestSDRAM64())printf("DDR Test OK!");
else printf("DDR Test Fail");

// ...


//MemTest.h -------------------------------------------------------------

#ifndef _MEMTEST_H_
#define _MEMTEST_H_

#ifdef __cplusplus
extern "C" {
#endif

#define u8 unsigned char
#define u16 unsigned short int
#define u32 unsigned int
#define u64 unsigned long long


#define SDRAM_BASE AWB0_DRAM_BASE

#define SDRAM_VOLUME 0x4000000 /* 64 MB */

#define IO volatile

u8 TestSDRAM8(void);
u8 TestSDRAM16(void);
u8 TestSDRAM32(void);
u8 TestSDRAM64(void);

#ifdef __cplusplus
}
#endif

#endif

//MemTest.с -------------------------------------------------------------
  
#include "MemTest.h"

#define NREAD 4 /* for REFRESH test */

const u64 Patterns[]=
{
 0x0000000000000000ULL,
 0xFFFFFFFFFFFFFFFFULL,
 0x5555555555555555ULL,
 0xAAAAAAAAAAAAAAAAULL,
 0x1111111111111111ULL,
 0x2222222222222222ULL,
 0x4444444444444444ULL,
 0x8888888888888888ULL,
 0x3333333333333333ULL,
 0x6666666666666666ULL,
 0x9999999999999999ULL,
 0xCCCCCCCCCCCCCCCCULL,
 0x7777777777777777ULL,
 0xBBBBBBBBBBBBBBBBULL,
 0xDDDDDDDDDDDDDDDDULL,
 0xEEEEEEEEEEEEEEEEULL,
};

u32 Seed;

u32 Random32(void)
{
 register u32 c=0x21;
 register u32 a=Seed;
 register u32 b;
 m0:
 b=a;
 a+=a;
 if(a>b) goto m1;
 a^=0xC5;
 m1:
 c--;
 if(c) goto m0;
 Seed=a;
 return Seed;
}

u8 TestSDRAM8(void)
{
 register u32 i,j,k;

 IO u8 *sdram8=(IO u8*)SDRAM_BASE;

 //Pattern Test 1
 for(i=0;i<SDRAM_VOLUME/sizeof(u8);i++)sdram8[i]=(u8)(Patterns[i&0xF]&0x00000000000000FF);
 for(k=0;k<NREAD;k++)for(i=0;i<SDRAM_VOLUME/sizeof(u8);i++)if(sdram8[i]!=((u8)(Patterns[i&0xF]&0x00000000000000FF)))return 0;

 //Pattern Test 2
 for(j=0;j<16;j++)
 {
  for(i=0;i<SDRAM_VOLUME/sizeof(u8);i++)sdram8[i]=(u8)(Patterns[j]&0x00000000000000FF);
  for(k=0;k<NREAD;k++)for(i=0;i<SDRAM_VOLUME/sizeof(u8);i++)if(sdram8[i]!=((u8)(Patterns[j]&0x00000000000000FF)))return 0;
 }

 //Random Test
 Seed=0x7FFFFFFF;
 for(i=0;i<SDRAM_VOLUME/sizeof(u8);i++)sdram8[i]=(u8)(Random32()&0x000000FF);
 for(k=0;k<NREAD;k++)
 {
  Seed=0x7FFFFFFF;
  for(i=0;i<SDRAM_VOLUME/sizeof(u8);i++)if(sdram8[i]!=((u8)(Random32()&0x000000FF)))return 0;
 }
 
 return 1;
}

u8 TestSDRAM16(void)
{
 register u32 i,j,k;

 IO u16 *sdram16=(IO u16*)SDRAM_BASE;

 //Pattern Test 1
 for(i=0;i<SDRAM_VOLUME/sizeof(u16);i++)sdram16[i]=(u16)(Patterns[i&0xF]&0x000000000000FFFF);
 for(k=0;k<NREAD;k++)for(i=0;i<SDRAM_VOLUME/sizeof(u16);i++)if(sdram16[i]!=((u16)(Patterns[i&0xF]&0x000000000000FFFF)))return 0;

 //Pattern Test 2
 for(j=0;j<16;j++)
 {
  for(i=0;i<SDRAM_VOLUME/sizeof(u16);i++)sdram16[i]=(u16)(Patterns[j]&0x000000000000FFFF);
  for(k=0;k<NREAD;k++)for(i=0;i<SDRAM_VOLUME/sizeof(u16);i++)if(sdram16[i]!=((u16)(Patterns[j]&0x000000000000FFFF)))return 0;
 }

 //Random Test
 Seed=0x7FFFFFFF;
 for(i=0;i<SDRAM_VOLUME/sizeof(u16);i++)sdram16[i]=(u16)(Random32()&0x0000FFFF);
 for(k=0;k<NREAD;k++)
 {
  Seed=0x7FFFFFFF;
  for(i=0;i<SDRAM_VOLUME/sizeof(u16);i++)if(sdram16[i]!=((u16)(Random32()&0x0000FFFF)))return 0;
 }
 
 return 1;
}

u8 TestSDRAM32(void)
{
 register u32 i,j,k;

 IO u32 *sdram32=(IO u32*)SDRAM_BASE;

 //Pattern Test 1
 for(i=0;i<SDRAM_VOLUME/sizeof(u32);i++)sdram32[i]=(u32)(Patterns[i&0xF]&0x00000000FFFFFFFF);
 for(k=0;k<NREAD;k++)for(i=0;i<SDRAM_VOLUME/sizeof(u32);i++)if(sdram32[i]!=((u32)(Patterns[i&0xF]&0x00000000FFFFFFFF)))return 0;

 //Pattern Test 2
 for(j=0;j<16;j++)
 {
  for(i=0;i<SDRAM_VOLUME/sizeof(u32);i++)sdram32[i]=(u32)(Patterns[j]&0x00000000FFFFFFFF);
  for(k=0;k<NREAD;k++)for(i=0;i<SDRAM_VOLUME/sizeof(u32);i++)if(sdram32[i]!=((u32)(Patterns[j]&0x00000000FFFFFFFF)))return 0;
 }

 //Random Test
 Seed=0x7FFFFFFF;
 for(i=0;i<SDRAM_VOLUME/sizeof(u32);i++)sdram32[i]=Random32();
 for(k=0;k<NREAD;k++)
 {
  Seed=0x7FFFFFFF;
  for(i=0;i<SDRAM_VOLUME/sizeof(u32);i++)if(sdram32[i]!=Random32())return 0;
 }

 return 1;
}

u8 TestSDRAM64(void)
{
 register u32 i,j,k;

 IO u64 *sdram64=(IO u64*)SDRAM_BASE;

 //Pattern Test 1
 for(i=0;i<SDRAM_VOLUME/sizeof(u64);i++)sdram64[i]=Patterns[i&0xF];
 for(k=0;k<NREAD;k++)for(i=0;i<SDRAM_VOLUME/sizeof(u64);i++)if(sdram64[i]!=Patterns[i&0xF])return 0;

 //Pattern Test 2
 for(j=0;j<16;j++)
 {
  for(i=0;i<SDRAM_VOLUME/sizeof(u64);i++)sdram64[i]=Patterns[j];
  for(k=0;k<NREAD;k++)for(i=0;i<SDRAM_VOLUME/sizeof(u64);i++)if(sdram64[i]!=Patterns[j])return 0;
 }

 //Random Test
 Seed=0x7FFFFFFF;
 for(i=0;i<SDRAM_VOLUME/sizeof(u64);i++)sdram64[i]=(((u64)Random32())<<32)|((u64)Random32());
 for(k=0;k<NREAD;k++)
 {
  Seed=0x7FFFFFFF;
  for(i=0;i<SDRAM_VOLUME/sizeof(u64);i++)if(sdram64[i]!=((((u64)Random32())<<32)|((u64)Random32())))return 0;
 }

 return 1;
}

 

 

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

51 минуту назад, __inline__ сказал:

Запустил тест памяти, который работал на C6745.  На A13 тест идёт 4 минуты, на C6745 тест памяти 5 минут.  У C6745 память SDRAM 16 bit, 152 МГц. У A13 DDR3, 408 МГц, шина тоже 16 бит.

Странно - Вы вроде боретесь за максимальную скорость при работе с большими массивами данных, а подключаете память по 16-битной шине... :unknw:

Даже у нас, хоть у нас и не критично было быстро работать с большими массивами, но память была подключена по 32-битной шине.

Или в C6745 только 16-битная шина максимум?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

51 minutes ago, jcxz said:

Странно - Вы вроде боретесь за максимальную скорость при работе с большими массивами данных, а подключаете память по 16-битной шине... :unknw:

Даже у нас, хоть у нас и не критично было быстро работать с большими массивами, но память была подключена по 32-битной шине.

Или в C6745 только 16-битная шина максимум?

 

1) На плате Olinuxino-A13  DDR распаяна 16-битная

2) На плате с C6745 (QFP корпус)  EMIFB только 16-битная

3) У OMAP-L138 не знаю что с шиной, плата пока ещё не приехала.

 

Quote

Или в C6745 только 16-битная шина максимум?

 

да.

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 минуты назад, __inline__ сказал:

Olinuxino-A13

А не лучше ли было за меньшие деньги взять какой-нибудь Orange Pi на базе H3 с DDR3 памятью и т.д.? A13 всё-таки старый и бюджетный SoC.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, NStorm said:

А не лучше ли было за меньшие деньги взять какой-нибудь Orange Pi на базе H3 с DDR3 памятью и т.д.? A13 всё-таки старый и бюджетный SoC. 

 

:wink: Эта плата у меня уже несколько лет лежит. Только сейчас добрался до неё.  На счёт DDR3 не понял, на плате запаяны пара DDR3 чипов по 256 МБ каждый.

 

Держу равнение на v3s. :sun_bespectacled: Потому что QFP и 64 МБ внутри. Как освою A13, буду мигрировать на v3s.

 

Вопрос темы остаётся открытым:  почему тест памяти длится почти одинаково?  В итоге C6745 на 456/152  почти также как и A13 960/408 .

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 минут назад, __inline__ сказал:

На счёт DDR3 не понял, на плате запаяны пара DDR3 чипов по 256 МБ каждый.

Я что-то невнимательно прочитал 1ый пост и почему-то подумал, что там еще DDR2.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Слона можно съесть по частям.

Тест синтетический и имеет разнообразный доступ.

Нужно определить как зависит скорость от разрядности доступа. Для начала также исключить тест с генерацией случайных чисел. Тесты проводились под линуксом?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, misyachniy сказал:

Тесты проводились под линуксом?

Мы тут вдвоем похоже с __inline__ ковыряем эти процы без осей :biggrin:  Но было б интересно, если кто-нибудь проверит тест под линуксом и сравнить результаты...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 minutes ago, mantech said:

Мы тут вдвоем похоже с __inline__ ковыряем эти процы без осей :biggrin:  Но было б интересно, если кто-нибудь проверит тест под линуксом и сравнить результаты...

Ну да при нескольких неизвестных, добавить еще одно или несколько неизвестных, чтобы окончательно запутаться.

У меня нет никакой платы. Вот это тоже подозрительно, так как частоты процессора и памяти не кратны

960 МГц, память на 408МГц.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

из теоретических соображений -

sdram контроллер может гадить - у китайцев армовский или самописный? например открывать/закрывать банк при каждом обращении и т.п.

шинные бриджи могут гадить и затыкаться - это надо либо думать при проектировании, либо много и нудно моделировать

может я зря современным китайцам не доверяю, а может и не зря - видел разное

qfp корпуса - то есть конроллер можно и осциллографом посмотреть, с внутренностями сложнее - может приоритеты надо расставить иначе, может еще что

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 minutes ago, misyachniy said:

Вот это тоже подозрительно, так как частоты процессора и памяти не кратны

960 МГц, память на 408МГц.

 

Кратные кварцу 24 МГц.  Что не так??? :acute:

5 minutes ago, yes said:

sdram контроллер может гадить - у китайцев армовский или самописный? например открывать/закрывать банк при каждом обращении и т.п.

 

Да кто-ж его знает? :)   С А13 вожусь чисто из-за академического интереса. Чотбы сравнить результат с C6745. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 hours ago, __inline__ said:

Кратные кварцу 24 МГц.  Что не так??? :acute:

В первый раз слышу чтобы кварц читал/писал данные в ОЗУ. ;-)

Сами посчитайте, в тактах процессора при соотношении частот 908/408 это периоды 1,1 и 2,5 наносекунд.

В идеальном случае, данные с памяти можно забрать на третий такт процессора 3/908 ~ 3,3нс

При частоте процессора 816МГц, данные можно забрать на второй такт 2/816 ~ 2,5нс

Прирост скорости 100 *(3,3-2,5)/3,3 = 24%.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

46 minutes ago, misyachniy said:

В первый раз слышу чтобы кварц читал/писал данные в ОЗУ. ;-)

Сами посчитайте, в тактах процессора при соотношении частот 908/408 это периоды 1,1 и 2,5 наносекунд.

В идеальном случае, данные с памяти можно забрать на третий такт процессора 3/908 ~ 3,3нс

При частоте процессора 816МГц, данные можно забрать на второй такт 2/816 ~ 2,5нс

Прирост скорости 100 *(3,3-2,5)/3,3 = 24%.

 

Это больше к авторам драйверов linux-sunxi :)  У них 408 МГц дефолтный дефайн на клок DDR3. Понимаю, что это криво.  Но я только начал копать......

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 5/28/2020 at 2:44 PM, misyachniy said:

Сами посчитайте, в тактах процессора при соотношении частот 908/408 это периоды 1,1 и 2,5 наносекунд.

В идеальном случае, данные с памяти можно забрать на третий такт процессора 3/908 ~ 3,3нс

При частоте процессора 816МГц, данные можно забрать на второй такт 2/816 ~ 2,5нс

Прирост скорости 100 *(3,3-2,5)/3,3 = 24%.

 

 

Пробовал  память 408, ядро 816 (x2) - хуже.

 Пробовал память 302, ядро 906 (x3) - ещё хуже.

 

Итого оставил как есть : 408/960 МГц.

 

Тестировал на игре (ниже).

 

 

В общем добил я до конца этот Allwinner, запустил игру на нём. 

 

Исходные данные:

 

1) частота ядра 908 МГц, память 408 МГц

 

2) включены кеш данных, инструкций, предсказание ветвлений. MMU настроен.

 

3) кадр 400x240, 2 байта на точку, 60 Гц прогрессивная развёртка

 

4) декодер музыки CELT v.10 (fixed point):  16 бит, 32 кГц, 1 канал

 

5) микширование звука : 16 бит, 32 кГц,  12 каналов

 

6) физический движок Box2D (floating point)

 

7) алгоритм игры на C++

 

8) подгрузка данных с SD-карты (режим SDIO, 4 бита, 25 МГц)

 

9) разжатие данных по алгоритму ZLIB

 

10) Управление 12-кнопочным кейпадом

 

Результаты:

 

С=0 B=0 103 FPS

 
C=1 B=0 400 FPS

 
C=0 B=1 210 FPS

 
C=1 B=1 420 FPS

 

C - бит кеширования, B - бит буферизации

 

FPS - весь ФПС игры (отрисовка + звук + логика игры + и т.п.)

 

Пересылку делал NEON'овскими инструкциями (адреса выровнены - как минимум надо на 64 байта, у меня кратно мегабайту):

 

void MEMCPY(u8 *dst,u8 *src,u32 sz)
{
 asm volatile(
              "1:                      \n"
              "VLDM %[src]!,{d0-d7}    \n"
              "VSTM %[dst]!,{d0-d7}    \n"
              "SUBS %[sz],%[sz],#0x40  \n"
              "BGT 1b                  \n"
              : [dst]"+r"(dst), [src]"+r"(src), [sz]"+r"(sz) : : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "cc", "memory"
            );
}

 

Далее прикрутил фильтр, увеличивающий кадр вчетверо: SaI2x - из 400x240 делает 800x480.

Весь FPS  игры стал 70..80 FPS.

 

Затем  задействовал DMA, сделал пересылку параллельно с остальным кодом.  FPS игры повысился до 90..100 FPS.

ДМА тут даёт выигрыш только за счёт параллельности.

 

Для сравнения: та же игра на C6745 DSP (456 / 152  МГц) на разрешении 400x240 с параллельной отрисовкой на PRU  даёт - 120..170 FPS.

 

Итого  вышло, что Allwinner A13 быстрее на игре в 2,5 раза, чем C6745.

 

P.S. Во всех  тестах вертикальная синхронизация (VSYNC) была временно отключена.  Целевой FPS игры - 60 к/c.

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 часов назад, __inline__ сказал:

Пересылку делал NEON'овскими инструкциями

Какие это дает преимущества и по сравнению с чем? У меня А13 на 650МГц почти не грелся, как в вашем случае?

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...