Jump to content

    

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;
}

 

 

Edited by __inline__

Share this post


Link to post
Share on other sites
51 минуту назад, __inline__ сказал:

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

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

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

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

Share this post


Link to post
Share on other sites
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-битная шина максимум?

 

да.

Edited by __inline__

Share this post


Link to post
Share on other sites
22 минуты назад, __inline__ сказал:

Olinuxino-A13

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

Share this post


Link to post
Share on other sites
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 .

Share this post


Link to post
Share on other sites
9 минут назад, __inline__ сказал:

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites
1 час назад, misyachniy сказал:

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

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

Share this post


Link to post
Share on other sites
10 minutes ago, mantech said:

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

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

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

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

 

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites
15 minutes ago, misyachniy said:

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

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

 

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

5 minutes ago, yes said:

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

 

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

Share this post


Link to post
Share on other sites
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%.

 

 

Share this post


Link to post
Share on other sites
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. Понимаю, что это криво.  Но я только начал копать......

Share this post


Link to post
Share on other sites

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