|
|
  |
Как настроить GCC на максимально эффективный код?, И как по чесному отключить семихостинг? |
|
|
|
Apr 1 2007, 11:17
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(klen @ Apr 1 2007, 09:36)  1. что такое семихостинг? В данном случае интерфейс доступа к ресурсам хоста для целей отладки и эмуляции всякой всячины типа дисков, экранов.... Висит естественно на SWI. Мешает. Цитата 2. A)а ... А вопрос, полагаю со стороны AlexandrY был больше риторический  , ибо учитывая его квалификацию все явные и неявные действия по ускорению, включая пересборку библиотек, он предпринял  ... Осталось либо спросить у узких "гнутых" специалистов в рассчете на наличие наихитрейшей хитрости, либо просто "пожаловаться" на то, что на данный момент все компиляторы реально уступают армо-кейловскому в части плавучки. Что и было сделано.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 1 2007, 22:24
|

бессмертным стать можно тремя способами
    
Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912

|
ну если конкретно про float, то можно попробывть чуток подразогнать -fno-math-errno -funsafe-math-optimizations -fno-trapping-math наверно придется пересобрать библу. но при такой оптимизации быстродействие достигается ценой отказа соостветствию стандарту IEEE, в частности не используются проверки аргументов на допустимосить и ненерация ошибок. К примеру можно будет засунуть sqrt хоть -100 но тогда результат будет зависеть от пятен на солнце, зато быстро! Так говорят доки. В два раза медленне .... это криминал  . дайте Ваш тормозящий кусок трассы и замеры сколько чешит в тактах из под Keil. очень внутриматочно разбиратся буду и сравнивать кейл с кодом котрый gcc сгенерит.
|
|
|
|
|
Apr 1 2007, 23:09
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(klen @ Apr 1 2007, 21:24)  В два раза медленне .... это криминал Ага. Код /* * Whetstone benchmark in C. This program is a translation of the * original Algol version in "A Synthetic Benchmark" by H.J. Curnow * and B.A. Wichman in Computer Journal, Vol 19 #1, February 1976. * * Used to test compiler optimization and floating point performance. */
#define ITERATIONS 10 /* 1 Million Whetstone instructions */
#include <math.h> #include <stdio.h>
float xx1, xx2, xx3, xx4, x, y, z, t, t1, t2; float e1[4]; unsigned int i, j, k, l, n1, n2, n3, n4, n6, n7, n8, n9, n10, n11;
void pa(float* e); void p3(float x, float y, float* z); void p0(void);
void main(void) { /* initialize constants */
t = 0.499975; t1 = 0.50025; t2 = 2.0;
/* set values of module weights */
n1 = 1 * ITERATIONS; n2 = 12 * ITERATIONS; n3 = 14 * ITERATIONS; n4 = 345 * ITERATIONS; n6 = 210 * ITERATIONS; n7 = 32 * ITERATIONS; n8 = 899 * ITERATIONS; n9 = 616 * ITERATIONS; n10 = 1 * ITERATIONS; n11 = 93 * ITERATIONS;
/* MODULE 1: simple identifiers */
xx1 = 1.0; xx2 = -1.0; xx3 = -1.0; xx4 = -1.0;
for(i = 1; i <= n1; i += 1) { xx1 = ( xx1 + xx2 + xx3 - xx4 ) * t; xx2 = ( xx1 + xx2 - xx3 + xx4 ) * t; xx3 = ( xx1 - xx2 + xx3 + xx4 ) * t; xx4 = (-xx1 + xx2 + xx3 + xx4 ) * t; }
/* MODULE 2: array elements */
e1[0] = 1.0; e1[1] = -1.0; e1[2] = -1.0; e1[3] = -1.0;
for (i = 1; i <= n2; i +=1) { e1[0] = ( e1[0] + e1[1] + e1[2] - e1[3] ) * t; e1[1] = ( e1[0] + e1[1] - e1[2] + e1[3] ) * t; e1[2] = ( e1[0] - e1[1] + e1[2] + e1[3] ) * t; e1[3] = (-e1[0] + e1[1] + e1[2] + e1[3] ) * t; }
/* MODULE 3: array as parameter */
for (i = 1; i <= n3; i += 1) pa(e1);
/* MODULE 4: conditional jumps */
j = 1; for (i = 1; i <= n4; i += 1) { if (j == 1) j = 2; else j = 3;
if (j > 2) j = 0; else j = 1;
if (j < 1 ) j = 1; else j = 0; }
/* MODULE 5: omitted */
/* MODULE 6: integer arithmetic */
j = 1; k = 2; l = 3;
for (i = 1; i <= n6; i += 1) { j = j * (k - j) * (l -k); k = l * k - (l - j) * k; l = (l - k) * (k + j);
e1[l - 2] = j + k + l; /* C arrays are zero based */ e1[k - 2] = j * k * l; }
/* MODULE 7: trig. functions */
x = 0.5; y = 0.5;
for(i = 1; i <= n7; i +=1) { x = t * atan(t2*sin(x)*cos(x)/(cos(x+y)+cos(x-y)-1.0)); y = t * atan(t2*sin(y)*cos(y)/(cos(x+y)+cos(x-y)-1.0)); }
/* MODULE 8: procedure calls */
x = 1.0; y = 1.0; z = 1.0;
for (i = 1; i <= n8; i +=1) p3(x, y, &z);
/* MODULE9: array references */
j = 1; k = 2; l = 3;
e1[0] = 1.0; e1[1] = 2.0; e1[2] = 3.0;
for(i = 1; i <= n9; i += 1) p0();
/* MODULE10: integer arithmetic */
j = 2; k = 3;
for(i = 1; i <= n10; i +=1) { j = j + k; k = j + k; j = k - j; k = k - j - j; }
/* MODULE11: standard functions */
x = 0.75; for(i = 1; i <= n11; i +=1) x = sqrt( exp( log(x) / t1)); }
void pa(float* e) { int j; j = 0; lab: e[0] = ( e[0] + e[1] + e[2] - e[3] ) * t; e[1] = ( e[0] + e[1] - e[2] + e[3] ) * t; e[2] = ( e[0] - e[1] + e[2] + e[3] ) * t; e[3] = ( -e[0] + e[1] + e[2] + e[3] ) / t2; j += 1; if (j < 6) goto lab; }
void p3(float x, float y, float* z) { x = t * (x + y); y = t * (x + y); *z = (x + y) /t2; }
void p0(void) { e1[j] = e1[k]; e1[k] = e1[l]; e1[l] = e1[j]; } Полагаю, что AlexandrY на этом разницу получил.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 2 2007, 00:39
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Не, извиняюсь, на Whetstone у GCC 4.1.1 результат еще ничего, на 5% только хуже. Это у GCC 3.3.1 были нереальные тормоза. Но вот в Dhrystone 2.1 GCC 4.1.1 в два раза отстает от RealView в Keil-e. Также GCC 4.1.1 в алгоритмах шифрования с DES3 отстает в 3-и раза, с AES256 в 4-е раза! Проект сделан в IDE от Keil-а, так что makefile нету, но проект выложу если надо. Сам GCC взят с сайта GNUARM, в виде бинарника. Почти такие же результаты дает CrossWorks на базе GCC 4.1.0 от Rowley, а уж они то свои библиотеки наверняка вылизали. Цитата(zltigo @ Apr 1 2007, 23:39)  Полагаю, что AlexandrY на этом разницу получил.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|