Войти
ПрограммированиеФорумОбщее

Отладчик Visual Studio (3 стр)

Страницы: 1 2 3 4 5 Следующая »
#30
16:33, 6 мар. 2014

gammaker
>Вообще какой скорости можно добиться на 1.6 ГГц процессоре в одном потоке? У меня с math.h получается 5000000 в секунду
i5 3.3Ghz (L3 6Mb) - 12млн за 76мс (double + sse2) [из моего старого доброго теста :)]

>но хотелось бы раз в 5 побыстрее.
А оно точно надо?

>Ну вообще я скатился в оффтоп с этими синусами.
Да да, лучше бы свою библиотеку выложил, а ещё лучше с движком, там к примеру на битбакед с приватнм доступом (и себе контроль версий и другам посмотреть) :)


#31
16:43, 6 мар. 2014

FireFenix
> Это понятно... Я к тому, что у тебя заточено под маложивущие строки в
> ограниченном количестве. И если рассматривать все ситуации, то профит
> сомнителен.
Ограничено не количество, а порядок создания строк. Если ты накапливаешь сотню строк и их всем скопом освобождаешь, повторяя этот цикл несколько раз, то да, будет неэффективно. А если используешь их так, как они обычно используются, то аллокатор будет задействован всегда с максимальной эффективностью, если не считать "прогрев" - первые несколько аллокаций делаются через malloc.
В 99% случаев профит есть. А для редких долго живущих строк аллокатор не нужен: один раз память выделил и пусть живёт. И вряд ли время аллокации будет сравнимо со аременем создания этой строки. Это и называется оптимизацией.

#32
17:45, 6 мар. 2014

}:+()___ [Smile]
> Откопал одну из реализаций с такой точностью:
Спасибо.

}:+()___ [Smile]
> Не могут, если они нормально написаны.
А как если первый байт UTF-8 говорит, сколько байт в последовательности, то он будет трактовать и обычные ASCII символы справа как часть последовательности, разве нет?

FireFenix
> Это довольно сложно...
Ну я же готов пожертвовать точностью. Точнее меня интересуют платформы x86 и ARM и не хочу использовать ассемблер.

FireFenix
> х86+SSE2
Это же для векторизации? Мне не нужно считать четыре синуса сразу, мне нужно по одному.

FireFenix
> А оно точно надо?
Если можно просто скопипастить код функции и использовать его вместо синуса, то да. Но не настолько, чтобы переписывать саму логику, которая использует эти синусы.

FireFenix
> Да да, лучше бы свою библиотеку выложил, а ещё лучше с движком, там к примеру
> на битбакед с приватнм доступом (и себе контроль версий и другам посмотреть) :)
Не, движок я в открытый доступ точно выкладывать не буду. А строки и всякие контейнеры выложу в выходные.

#33
17:58, 6 мар. 2014

gammaker
> разве нет?
Нет. По первым двум битам каждого байта можно однозначно сказать, является ли он началом или серединой символа.
Соответственно, если при разборе попадется раньше времени начальный символ, то однозначно детектируется ошибка.

#34
18:05, 6 мар. 2014

}:+()___ [Smile]
> Откопал одну из реализаций с такой точностью:
Вот только она работает почему-то на 20% медленнее, чем sin из math.h.

}:+()___ [Smile]
> Нет. По первым двум битам каждого байта можно однозначно сказать, является ли
> он началом или серединой символа.
> Соответственно, если при разборе попадется раньше времени начальный символ, то
> однозначно детектируется ошибка.
Ладно, как-нибудь поизучаю этот вопрос.

#35
18:09, 6 мар. 2014

gammaker
> Это же для векторизации? Мне не нужно считать четыре синуса сразу, мне нужно по одному.
SSE2 - набор инструкций для процессора (естественно код с SSE2 без поддержки процом - пахать не будет) [грубо говоря линейка начиная с Pentium 4]
Оптимизация включается в компилере - Enable Enchanted Instruction Set.
Юзается всё также как юзалось - math.h -> std::sin() / cos() / etc

Не знаю как для AVX, для SSE2 у МС отдельная заточка под тригонометрию

#36
18:38, 6 мар. 2014

gammaker
> Вот только она работает почему-то на 20% медленнее, чем sin из math.h.
Потому что там округление делается с помощью floor. Обычно абсолютная строгость не нужна и округляют магическими числами (ну или пишут на асме, там есть нужные инструкции). Еще, если известно, что аргумент положительный, то можно сделать просто (int)val (какой идиот вообще придумал округление в сторону нуля?).

#37
18:57, 6 мар. 2014

FireFenix
> естественно код с SSE2 без поддержки процом - пахать не будет
Вот только где найти такой x86 проц, который его не поддерживает? В музее?

FireFenix
> Оптимизация включается в компилере - Enable Enchanted Instruction Set.
Проблема в том, что я использую другую CRT для экономии размера exe и чтобы не было зависимости от MSVC++ Redistributable, но с ней SSE2 и AVX не линкуются. В 2012 студии линковалось, а в 2013 перестало. Пришлось отключить. Такие ошибки:

1>Demo1.obj : error LNK2001: неразрешенный внешний символ "__dtoul3"
1>Demo1.obj : error LNK2001: неразрешенный внешний символ "__ftoui3"
1>Demo1.obj : error LNK2001: неразрешенный внешний символ "__ultod3"

}:+()___ [Smile]
> Обычно абсолютная строгость не нужна и округляют магическими числами
Это как?

}:+()___ [Smile]
> Еще, если известно, что аргумент положительный, то можно сделать просто
> (int)val
В моём случае так есть. Но разве приведение float<->int не медленная операция? Я думал, floor/trunc для того и придумали, что они быстрее?

#38
20:03, 6 мар. 2014

gammaker
> Это как?
Например, так:

float to_int(float x)
{
    const float a = 3 << 22;
    return x + a - a;
}
Но это работает только в определенном диапазоне и компилятор при соответствующих флагах (-Ofast) может это "упростить" до нерабочего состояния.

> Но разве приведение float<->int не медленная операция?
Нет, все варианты этой инструкции выполняются за пару тактов. Медленными могут быть всякие строгие соответствия стандартам, типа IEEE 754.

#39
20:25, 6 мар. 2014

}:+()___ [Smile]
> Но это работает только в определенном диапазоне и компилятор при
> соответствующих флагах (-Ofast) может это "упростить" до нерабочего состояния.
Не, тогда такое я юзать не буду. Мне не нужны проблемы, которые зависят от настроек компилятора.

}:+()___ [Smile]
> Медленными могут быть всякие строгие соответствия стандартам, типа IEEE 754.
А что за соответствия и когда они включаются? Я так понимаю, чтобы этого не было, в студии для операций с плавующей запятой должны стоять fast, а не strict или precise? Кстати, на что вообще эти параметры влияют?

#40
21:41, 6 мар. 2014

gammaker
> А что за соответствия и когда они включаются?
Это четко прописанная реакция на нестандартные ситуации, всякие NaN-ы, бесконечности и тому подобное. Библиотечные функции обязаны определенным образом фиксировать FP-исключения (см. fegetenv). Вот на этой фигне и теряется вся скорость.

> Кстати, на что вообще эти параметры влияют?
Например, в случае fast у меня сократило x + a - a до x. А при strict честно сложило и отняло. IEEE 754 — это достаточно строгий стандарт, для простых операций определяет результат с точностью до бита. Соответственно, при strict компилятор четко следует стандарту, в случае же fast может забивать на некоторые вещи.

#41
6:57, 7 мар. 2014

gammaker
> Вот только где найти такой x86 проц, который его не поддерживает? В музее?
я же писал, что поддержка SSE2 появилась у процессоров в ~2000г, т.е. поддерживают точно все процессоры начиная с Pentium 4. (т.е. все процессоры новее 2000г.!)

>Проблема в том, что я использую другую CRT для экономии размера exe и чтобы не было зависимости от MSVC++ Redistributable
Уууу, братюня! Я вижу мы шли одинаковым путём Изображение
У меня были планы написать свой crt Изображение, только вначале нужно допилить до приемлемого состояния свой типа фреймворк

>пришлось отключить
можно выдрать и сделать свои или подключить crt'шные. crt хитра штука, они мат функции и операции со строками делают в asm, компилят в masm и подключают отдельными символами

#42
11:41, 7 мар. 2014

FireFenix
> У меня были планы написать свой crt
Я когда-то пробовал писать без CRT, но оказалось, что исключения не работают (от которых я сейчас как раз отказываюсь) и какие-то проблемы были с float'ами. Перерыл все исходники crt из студии, но так и не нашёл недостающих символов. Так и не получилось решить эти проблемы, и я решил не отказываться от crt. А потом я где-то откопал msvcrt.lib, которая линкует динамически со старой msvcrt.dll, которая встроена во все винды. Вот её и использую. И размер exe меньше, чем даже со своей crt, и зависимостей никаких.

FireFenix
> можно выдрать и сделать свои или подключить crt'шные. crt хитра штука, они мат
> функции и операции со строками делают в asm, компилят в masm и подключают
> отдельными символами
Попробую как-нибудь, наверное вечером.

#43
13:11, 7 мар. 2014

gammaker
> Проблема в том, что я использую другую CRT для экономии размера exe
Экономите на спичках?

> и чтобы не было зависимости от MSVC++ Redistributable
А вы как CRT к своему проекту цепляете? Статически или динамически (/MT или /MD)?

Если статические и появляются зависимости от MSVC++ Redistributable, то кто-то другой (DLL, например, которую вы используете) значит использует MSVC++ Redistributable.

Например, у меня есть проект на Qt. Достаточно большой.
Сам проект создается с /MT (релиз соответственно).
У моих exe и dll зависимостей от msvcrt100.dll нет, но Qt (суки) зависит от msvcrt100.dll.

#44
13:52, 7 мар. 2014

gammaker
>Я когда-то пробовал писать без CRT, но оказалось, что исключения не работают (от которых я сейчас как раз отказываюсь) и какие-то проблемы были с float'ами.
Понятное дело, ведь нада понять вначале что делает crt!
Он инициализирует статичные и глобальные переменные, ставить глобальный обработчик исключений и эту канитель с Си исключениями и иницирует crt лабуду типа потоков.

Естественно если не использовать crt, то чтобы работало - нужно делать самому =)

Небось ещё вот эту https://github.com/leepa/libctiny юзаешь, не?

>какие-то проблемы были с float'ами
символы для флоатов как я гвоорил - идут как asm, часть asm есть в сырцых crt, часть - зашита в lib'ку

Страницы: 1 2 3 4 5 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.