repstosw 18 21 мая, 2020 Опубликовано 21 мая, 2020 (изменено) · Жалоба Добрый день. Сейчас плотно занимаюсь оллвиннером 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; } Изменено 21 мая, 2020 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 21 мая, 2020 Опубликовано 21 мая, 2020 · Жалоба 51 минуту назад, __inline__ сказал: Запустил тест памяти, который работал на C6745. На A13 тест идёт 4 минуты, на C6745 тест памяти 5 минут. У C6745 память SDRAM 16 bit, 152 МГц. У A13 DDR3, 408 МГц, шина тоже 16 бит. Странно - Вы вроде боретесь за максимальную скорость при работе с большими массивами данных, а подключаете память по 16-битной шине... Даже у нас, хоть у нас и не критично было быстро работать с большими массивами, но память была подключена по 32-битной шине. Или в C6745 только 16-битная шина максимум? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 21 мая, 2020 Опубликовано 21 мая, 2020 (изменено) · Жалоба 51 minutes ago, jcxz said: Странно - Вы вроде боретесь за максимальную скорость при работе с большими массивами данных, а подключаете память по 16-битной шине... Даже у нас, хоть у нас и не критично было быстро работать с большими массивами, но память была подключена по 32-битной шине. Или в C6745 только 16-битная шина максимум? 1) На плате Olinuxino-A13 DDR распаяна 16-битная 2) На плате с C6745 (QFP корпус) EMIFB только 16-битная 3) У OMAP-L138 не знаю что с шиной, плата пока ещё не приехала. Quote Или в C6745 только 16-битная шина максимум? да. Изменено 21 мая, 2020 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NStorm 0 21 мая, 2020 Опубликовано 21 мая, 2020 · Жалоба 22 минуты назад, __inline__ сказал: Olinuxino-A13 А не лучше ли было за меньшие деньги взять какой-нибудь Orange Pi на базе H3 с DDR3 памятью и т.д.? A13 всё-таки старый и бюджетный SoC. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 21 мая, 2020 Опубликовано 21 мая, 2020 · Жалоба 1 hour ago, NStorm said: А не лучше ли было за меньшие деньги взять какой-нибудь Orange Pi на базе H3 с DDR3 памятью и т.д.? A13 всё-таки старый и бюджетный SoC. Эта плата у меня уже несколько лет лежит. Только сейчас добрался до неё. На счёт DDR3 не понял, на плате запаяны пара DDR3 чипов по 256 МБ каждый. Держу равнение на v3s. Потому что QFP и 64 МБ внутри. Как освою A13, буду мигрировать на v3s. Вопрос темы остаётся открытым: почему тест памяти длится почти одинаково? В итоге C6745 на 456/152 почти также как и A13 960/408 . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NStorm 0 21 мая, 2020 Опубликовано 21 мая, 2020 · Жалоба 9 минут назад, __inline__ сказал: На счёт DDR3 не понял, на плате запаяны пара DDR3 чипов по 256 МБ каждый. Я что-то невнимательно прочитал 1ый пост и почему-то подумал, что там еще DDR2. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
misyachniy 0 27 мая, 2020 Опубликовано 27 мая, 2020 · Жалоба Слона можно съесть по частям. Тест синтетический и имеет разнообразный доступ. Нужно определить как зависит скорость от разрядности доступа. Для начала также исключить тест с генерацией случайных чисел. Тесты проводились под линуксом? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 49 27 мая, 2020 Опубликовано 27 мая, 2020 · Жалоба 1 час назад, misyachniy сказал: Тесты проводились под линуксом? Мы тут вдвоем похоже с __inline__ ковыряем эти процы без осей Но было б интересно, если кто-нибудь проверит тест под линуксом и сравнить результаты... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
misyachniy 0 27 мая, 2020 Опубликовано 27 мая, 2020 · Жалоба 10 minutes ago, mantech said: Мы тут вдвоем похоже с __inline__ ковыряем эти процы без осей Но было б интересно, если кто-нибудь проверит тест под линуксом и сравнить результаты... Ну да при нескольких неизвестных, добавить еще одно или несколько неизвестных, чтобы окончательно запутаться. У меня нет никакой платы. Вот это тоже подозрительно, так как частоты процессора и памяти не кратны 960 МГц, память на 408МГц. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 7 27 мая, 2020 Опубликовано 27 мая, 2020 · Жалоба из теоретических соображений - sdram контроллер может гадить - у китайцев армовский или самописный? например открывать/закрывать банк при каждом обращении и т.п. шинные бриджи могут гадить и затыкаться - это надо либо думать при проектировании, либо много и нудно моделировать может я зря современным китайцам не доверяю, а может и не зря - видел разное qfp корпуса - то есть конроллер можно и осциллографом посмотреть, с внутренностями сложнее - может приоритеты надо расставить иначе, может еще что Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 27 мая, 2020 Опубликовано 27 мая, 2020 · Жалоба 15 minutes ago, misyachniy said: Вот это тоже подозрительно, так как частоты процессора и памяти не кратны 960 МГц, память на 408МГц. Кратные кварцу 24 МГц. Что не так??? 5 minutes ago, yes said: sdram контроллер может гадить - у китайцев армовский или самописный? например открывать/закрывать банк при каждом обращении и т.п. Да кто-ж его знает? :) С А13 вожусь чисто из-за академического интереса. Чотбы сравнить результат с C6745. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
misyachniy 0 28 мая, 2020 Опубликовано 28 мая, 2020 · Жалоба 15 hours ago, __inline__ said: Кратные кварцу 24 МГц. Что не так??? В первый раз слышу чтобы кварц читал/писал данные в ОЗУ. ;-) Сами посчитайте, в тактах процессора при соотношении частот 908/408 это периоды 1,1 и 2,5 наносекунд. В идеальном случае, данные с памяти можно забрать на третий такт процессора 3/908 ~ 3,3нс При частоте процессора 816МГц, данные можно забрать на второй такт 2/816 ~ 2,5нс Прирост скорости 100 *(3,3-2,5)/3,3 = 24%. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 28 мая, 2020 Опубликовано 28 мая, 2020 · Жалоба 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. Понимаю, что это криво. Но я только начал копать...... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 1 июня, 2020 Опубликовано 1 июня, 2020 (изменено) · Жалоба 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. Изменено 1 июня, 2020 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 49 1 июня, 2020 Опубликовано 1 июня, 2020 (изменено) · Жалоба 5 часов назад, __inline__ сказал: Пересылку делал NEON'овскими инструкциями Какие это дает преимущества и по сравнению с чем? У меня А13 на 650МГц почти не грелся, как в вашем случае? Изменено 1 июня, 2020 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться