User Tag List

Показано с 1 по 10 из 54

Тема: SDCC: Автоматизация

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #11

    Регистрация
    27.01.2005
    Сообщений
    924
    Спасибо Благодарностей отдано 
    28
    Спасибо Благодарностей получено 
    193
    Поблагодарили
    154 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Сделал 2 теста.

    Один проверяет точность, второй на скорость.

    Моя реализация сложения float в три с половиной раза быстрее того, что есть в библиотеке SDCC.

    Точность чуть хромает иногда. Младший разряд. Но это гдето на одно сложений случайных чисел на 500.

    Время мерял через int. Соответсвенно, у меня 300 сложений занимает 11*0.02=0.22сек. Стандартные 37*0.02=0.74сек.

    Т.е. вариант стандартный 0.0025 сек на сложение.
    Вариант мой: 0.00073 сек на сложение.

    Все примерно, конечно.

    Исходный код теста (testapp/main.c):
    Код:
    #include <math.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <color.h>
    #include <im2.h>
    //
    #include <stdint.h>
    #include <string.h>
    #include <math.h>
    //
    #define __SDCC_FLOAT_LIB 1
    #include <float.h>
    
    // Test iterations
    #define iteration	300
    
    float a=-0.5e-3;
    float b=1.5e2;
    
    union flong{
    	float f;
    	uint32_t l;
    };
    
    float fsadd(float a, float b)__naked;
    
    /*
    void fprint(float v){
    	union flong f;
    	f.f=v;
    	printf("%f [%.8lX]",f.f, f.l);
    }
    */
    
    // Correct addition
    void test_1(){
    	union flong fl1;
    	union flong fl2;
    	//
    	float fa1;
    	float fa2;
    	//
    	int err;
    	int ok;
    	//
    	int i;
    	//
    	err=0;
    	ok=0;
    	//
    	printf("test_1() begin\n");
    	//
    	for(i=0; i<iteration; i++){
    		// Generage two floats
    		fl1.l = ((uint32_t)rand()) | (((uint32_t)rand())<<16);
    		fl2.l = ((uint32_t)rand()) | (((uint32_t)rand())<<16);
    		// Addition
    		fa1 = fl1.f + fl2.f;
    		fa2 = fsadd( fl1.f , fl2.f );
    		// Ok or Error
    		if( fa1 == fa2 ){
    			ok++;
    		}
    		else{
    			err++;
    			fl1.f=fa1;
    			fl2.f=fa2;
    			printf("\nerr: %.8lX,%.8lX\n", fl1.l, fl2.l);
    			printf("err: %.10f,%.10f\n", fl1.f, fl2.f);
    		}
    		//printf("[f1=%f] [f2=%f] ok=%i, err=%i\n", fl1.f, fl2.f, ok, err );
    		printf("ok=%i, err=%i\r", ok, err);
    	}
    	printf("\ntest_1() end\n");
    }
    
    //
    static volatile int	timer;
    void timerhdl(){
    	timer++;
    }
    void fdummy(float f){}
    
    float testArray1[iteration];
    float testArray2[iteration];
    
    // Speed addition
    void test_2(){
    	int	time0;
    	int	time1;
    	//
    	int i;
    	//
    	printf("\ntest_2() begin\n");
    	//
    	printf("Generate arrays. Wait.\n");
    	for(i=0; i<iteration; i++){
    		// Generage two floats
    		testArray1[i] = ((uint32_t)rand()) | (((uint32_t)rand())<<16);
    		testArray2[i] = ((uint32_t)rand()) | (((uint32_t)rand())<<16);
    	}
    	
    	// Standart
    	CLI();
    	timer=0;
    	im2SetHandler(timerhdl);
    	im2Set();
    	printf("Standart additions. Wait.\n");
    	SEI();
    	for(i=0; i<iteration; i++){
    		// Addition
    		fdummy(testArray1[i] + testArray2[i]);
    	}
    	time0 = timer;
    
    	// SfS
    	CLI();
    	timer=0;
    	im2SetHandler(timerhdl);
    	im2Set();
    	printf("SfS additions. Wait.\n");
    	SEI();
    	for(i=0; i<iteration; i++){
    		// Addition
    		fdummy(fsadd( testArray1[i], testArray2[i] ));
    	}
    	time1 = timer;
    	//
    	printf("Std add=%i, SfS add=%i\n",time0,time1);
    	//
    	printf("test_2() begin\n");
    }
    
    // Начало
    void main(){
    	CLI();
    	//
    	ccls(ATTRN(YELLOW,BLACK));
    	print("Float running\n\n");
    	/*
    	printf("a=");fprint(a);putchar('\n');
    	printf("b=");fprint(b);putchar('\n');
    	printf("a+b= %f ",a+b);fprint(fsadd(a,b));putchar('\n');
    	printf("\nOk\n");
    	*/
    	test_1();
    	test_2();
    	//
    	while(1);
    }
    Для переключения в библиотеке стандартной и моей реализации, необходимо выставить символ SFS_FLOAT в файле configs/sfs_float.mk

    Для запуска теста, надо ставить SFS_FLOAT=n (в библиотеке будет использоваться стандартная реализация сложения).

    Если хочется попробовать мою реализацию в библиотеке, то ставьте SFS_FLOAT=y.
    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	floattest.jpg 
Просмотров:	68 
Размер:	17.8 Кб 
ID:	59479  
    Вложения Вложения
    Последний раз редактировалось SfS; 21.01.2017 в 15:49.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. SDCC: библиотеки для ZX
    от Sergey в разделе Программирование
    Ответов: 10
    Последнее: 25.10.2015, 19:30
  2. Бага SDCC версии 3.3.0
    от TSL в разделе Программирование
    Ответов: 37
    Последнее: 20.04.2014, 17:31
  3. sdcc. с чего начать.
    от ALKO в разделе Программирование
    Ответов: 42
    Последнее: 16.09.2012, 15:49
  4. SDCC вокруг да около
    от andrews в разделе Программирование
    Ответов: 8
    Последнее: 26.03.2008, 08:16

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •