Важная информация

User Tag List

Страница 3 из 6 ПерваяПервая 123456 ПоследняяПоследняя
Показано с 21 по 30 из 54

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

  1. #21
    Member
    Регистрация
    25.11.2015
    Адрес
    г. Москва
    Сообщений
    192
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    14 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    SfS, а насколько дико? Вот здесь есть табличка про некоторую библиотеку которая даёт в среднем 163 микросекунды на сложение, 693 на умножение и 905 на деление, на Z80 с частотой 6МГц. Если пересчитать в такты, то получается 978, 4158 и 5430 соответственно, чтобы понять много это или мало, можно прикинуть сколько тактов требует умножение 24x24. Если делать через три умножения формата 8x24, поместив один множитель в C:D:E, в A:H:L записав 0, а в B записывая очередной байт второго множителя, то выполнив 8 раз блок ADD HL,HL/ADC A,A/RL B/JR NC,Xn/ADD HL,DE/ADC A,C/JR NC,Xn/INC B/Xn: на выходе в B:A:H:L мы получим 32х разрядное произведение. Среднее время выполнения умножения 8X24 составляет 8*(11+4+8)+4*(7+12+11+4)+2*(7+12+4)=366 тактов, или 1098 тактов на вычисление всех трёх произведений, без учёта загрузки регистров и окончательного суммирования. Чтобы обработать знаки,порядки и всякие исключительные ситуации думаю еще тактов 500 потребуется, в общем по сравнению с существующими библиотеками максимальное ускорение которое можно получить переписав всё на ассемблер это 2-3 раза.
    Последний раз редактировалось blackmirror; 27.12.2016 в 21:34.

  2. #22
    Master
    Регистрация
    27.01.2005
    Сообщений
    895
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    176
    Поблагодарили
    142 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Два-три раза - это существенно.
    А где такую "некоторую библиотеку" взять? Оно ж наверное несвободно.

  3. #23
    Member
    Регистрация
    25.11.2015
    Адрес
    г. Москва
    Сообщений
    192
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    14 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    SfS, у меня такое подозрение что библиотека входит в состав какого-то их продукта, но без регистрации даже документацию не почитать, а полей заполнять там нужно дофига. Есть упоминание про "We sell on 30-day free trial, so you can test it in your application". Еще интересная фраза "They are fast because they are written in assembly language and specifically optimized for each processor", но закрадывается подозрение что либо переводили с Си, либо для умножения мантиссы использовали умножение 32x32. Хотя может всё дело в том, что обработка IEEE 754 для Z80 не слишком удобна, поскольку приходится извлекать порядок из двух байт, прежде чем можно будет обрабатывать всякие NaN, INF и денормализованные числа. Еще и 4 возможных способа округления тоже наверно не очень способствуют компактности кода.

  4. #24
    Master
    Регистрация
    27.01.2005
    Сообщений
    895
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    176
    Поблагодарили
    142 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    извлечение порядка и мантиссы несложно сделать.
    я сейчас пробую написать сложение float+float на асме. Хочу заменить им стандартную сишную функцию для float и посмотреть разницу в скорости.

  5. #25
    Moderator
    Регистрация
    14.08.2006
    Адрес
    Владимир
    Сообщений
    4,577
    Спасибо Благодарностей отдано 
    61
    Спасибо Благодарностей получено 
    106
    Поблагодарили
    92 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от SfS Посмотреть сообщение
    извлечение порядка и мантиссы несложно сделать.
    я сейчас пробую написать сложение float+float на асме. Хочу заменить им стандартную сишную функцию для float и посмотреть разницу в скорости.
    есть же готовые либы в исходниках, например от HitechC , они на ассемблере уже ЕМНИП
    Лучше сделать и жалеть, чем не сделать и жалеть.

    Некоторые из моих поделок тут: https://github.com/serge-404

  6. #26
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,604
    Спасибо Благодарностей отдано 
    2,173
    Спасибо Благодарностей получено 
    133
    Поблагодарили
    99 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    А вдруг SfS лучше сделает?

  7. #27
    Master
    Регистрация
    27.01.2005
    Сообщений
    895
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    176
    Поблагодарили
    142 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Ну поскольку я на новый год уезжал, то не сделал ещё вообще никак)

  8. #28
    Master
    Регистрация
    27.01.2005
    Сообщений
    895
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    176
    Поблагодарили
    142 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Ну вот и первые результаты. Пока теста скорости нет. Отлаживаю обработку.
    Для скорости пришлось пожертвовать дополнительным скрытым битом, что для спека вполне нормально. 24бита точности хватит за глаза.

    Кому интересно - программа называется testapp. В файле main.c вставляете свои значение переменных a= и b=, компилируете и запускаете в эмуле.
    Пока вроде работает корректно.

    Процедура сложения двух float'ов - в файле testapp/float.s.
    Вложения Вложения

  9. #29
    Master
    Регистрация
    27.01.2005
    Сообщений
    895
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    176
    Поблагодарили
    142 сообщений
    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 
Просмотров:	47 
Размер:	17.8 Кб 
ID:	59479  
    Вложения Вложения
    Последний раз редактировалось SfS; 21.01.2017 в 15:49.

  10. #30
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,604
    Спасибо Благодарностей отдано 
    2,173
    Спасибо Благодарностей получено 
    133
    Поблагодарили
    99 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    А хорошо бы вообще заиметь 24-битную вещ. арифметику для типа float и 32-битную для double, больше нет смысла на Z80 имхо. Но это к разработчикам компилеров. А так - вижу старания SfS, респектирую и понимаю как это всё трудно встроить в свой процесс разработки.

    - - - Добавлено - - -

    Аргумент против 5-байтного представления вещ. чисел (как это реализовано в ПЗУ ZX Spectrum) - слишком медленно.

Страница 3 из 6 ПерваяПервая 123456 ПоследняяПоследняя

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

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

Эту тему просматривают: 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

Ваши права

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