А это нормально, что результаты полученные с помощью simd кода немного отличаются от кода без онного?
ну , например рейкаст из миллиона лучей обычным кодом дает 500000 пересечений а simd 500005, сцена абсолютно одинаковая и статичная. Алгоритм тоже одинаковый, только данные векторизованы.
Регистр SSE - 32 бита, регистр AVX - 64 бита, а регистр FPU - 80 бит. Точность разная, может, в этом дело?
Mira
ну для меня вопрос нужен\не нужен не стоит после того как я добился ускорения на 100%. Просто хочу понять изза чего разные результаты получаются.
Кстати, речь об юнити и c#. Компилятор там один(почти).
Моласар
> Регистр SSE - 32 бита, регистр AVX - 64 бита, а регистр FPU - 80 бит.
Ау, это что за бред?
Polyflow3d
> Просто хочу понять изза чего разные результаты получаются.
А как ты настраиваешь FPU/SSE? Если никак - сам себе злобный буратино.
тогда фиг его знает, если float и там и там. может опять все сводитсмя к потере точности из-за лишнего умножения и упирается в тотже эпсилон =)
Bishop
> Ау, это что за бред?
Судя по твоему посту, ты знаешь такие аббревиатуры, как FPU и SSE. Уже хорошо. Тогда в чём же именно ты увидел "бред"?
Моласар
> Регистр SSE - 32 бита, регистр AVX - 64 бита[b]Моласар[/b]
Регистры в SSE имеют размер 128 бит https://ru.wikipedia.org/wiki/SSE
Регитсры в AVX имеют размер 256 бит https://ru.wikipedia.org/wiki/AVX
kostian75
Я уже поделил на 4, чтобы наглядно показать, сколько бит на одно число с плавающей точкой придётся. Не нужно цепляться к словам. Слово "регистр" тут употреблено в значении "аналог регистра FPU", а не в значении физического регистра, который, вообще говоря, нас не интересует в вопросах точности.
Моласар
SSE - длина регистра 128 бит
AVX - 256 бит
AVX512 - 512 бит
FPU может работать в режимах точности 32, 64 и 80 бит. SSE и AVX могут работать в режимах точности 32 и 64 бит. Единственное что мне пришло на ум, это то, что ты под SSE мог подразумевать машины без SSE2, но все x86_64 процессоры держат SSE2+, т.е. речь о процах до 2007 года чтоли? Думаю нет, да и про AVX было, а это уже явно что-то поновее.
Моласар
> Я уже поделил на 4, чтобы наглядно показать, сколько бит на одно число с
> плавающей точкой придётся. Не нужно цепляться к словам. Слово "регистр" тут
> употреблено в значении "аналог регистра FPU", а не в значении физического
> регистра, который, вообще говоря, нас не интересует в вопросах точности.
Oo. А что тогда делает ADDPD XMM0, XMM1? Вот ответ из доки:
ADDPD (128-bit Legacy SSE version)
DEST[63:0] ← DEST[63:0] + SRC[63:0];
DEST[127:64] ← DEST[127:64] + SRC[127:64];
Bishop
> FPU может работать в режимах точности 32, 64 и 80 бит.
Если не трогать контролфп, то он работает в 64 битах на 32-битных осях и 80 битах на 64-битных (о чём я и говорил).
SSE всегда даёт 32-битную точность, если не использовать SSE2, который таки да, работает с даблами, НО может обработать только два дабла за операцию (как в приведённом addpd). Поэтому я даже не говорю про ущербность под названием SSE2+, а вот AVX уже умеет 4 дабла за такт и может потягаться по точности с сопром - хотя 80-битной точности и не достигает.
Насчёт ZMM-регистров я не в курсе, есть ли там работа с 4-мя extended double за раз, т.к. не работал с AVX2.
Так что прежде чем хамить пользователям, употребляя в их адрес слово "бред", неплохо бы сначала выяснить, что имелось в виду.
Моласар
>Если не трогать контролфп, то он работает в 64 битах на 32-битных осях
Источник?
FordPerfect
Не помню, где-то читал. Возможно, это относится только к старым компиляторам. Сейчас глянул в MSDN - пишут, что /fp:precise ставит extended double.
В любом случае, точность FPU не ниже double, если принудительно не выставить контролфп-ом или в настройках компилятора.
Моласар
> Если не трогать контролфп
Ну так трогай. Я выше написал что не настраивать что FPU, что SSE верх глупости. т.к. результаты будут какие попало.
> Поэтому я даже не говорю про ущербность под названием SSE2+
Ну вот и зря. По 2 дабла всёже лучше чем по одному. Как бы в 2 раза быстрее.
> Так что прежде чем хамить пользователям, употребляя в их адрес слово "бред",
> неплохо бы сначала выяснить, что имелось в виду.
Может я и погорячился, но вам бы не мешало тогда чётко писать что вы имеете ввиду. Т.к. телепатов тут нет, а регистры SSE всё же 128-бит. Сейчас я понял что вы имели ввиду, но сразу - нет. Мало того, вы ещё и выразились неверно. Нет SSE или AVX регистров, есть только XMM и YMM. Да можно о них сказать как о SSE и AVX, но когда так говорят обычно не подразумевается версия SSE и AVX. Т.е. говоря про SSE регистры набор команд может быть смело SSE4.2. Короче у вас вкрай не точная формулировка.
Bishop
> Я выше написал что не настраивать что FPU, что SSE верх глупости. т.к.
> результаты будут какие попало.
Ну так в SSE любой версии нельзя получить 80-битную точность, как на FPU. Я сразу предположил, что отсюда и проблемы точности у ТС-а.
> По 2 дабла всёже лучше чем по одному. Как бы в 2 раза быстрее.
Вот лично мне - неудобно по 2 дабла. Видимо, и другим было неудобно, раз придумали AVX.
Моласар
> Ну так в SSE любой версии нельзя получить 80-битную точность, как на FPU. Я
> сразу предположил, что отсюда и проблемы точности у ТС-а.
В этом вы правы. Я акцентирую внимание на том, что нужно сразу и чётко решать с какой точностью делать вычисления и делать соотв. установки. Конечно если вы решили что вам нужно именно 80 бит, то ни о каком SIMD речи идти не может.
> Вот лично мне - неудобно по 2 дабла.
Ну мало ли кому что не удобно... на асме писать так вообще очень не удобно, но когда надо - делаешь. Тут тоже самое. Вот тебе набо по задаче 64-бит точность, а есть только 128 битные регистры. Ну и будешь по 2 считать :)
> Видимо, и другим было неудобно, раз придумали AVX.
Не потому. Плюс сам AVX имеет только по 8 Float. Работа с даблами с AVX2.
Тема в архиве.