LINUX.ORG.RU

clang 19.1 удалил поддержку 3dnow.

 ,


0

3

Сабж: https://www.phoronix.com/news/LLVM-Ends-AMD-3DNow

Не знал, где написать, тут или Talks. Решил тут.

Так что если у кого остались Athlon до Athlon XP, то тогда использовать используйте gcc или clang 18.

Скрин максимального процессора Athlon без SSE: http://valid.x86.fr/cache/screenshot/69hccl.png

Если кто-то никогда не видел как выглядит 3dnow,и кому интересно, вот пример функции вычисления векторного произведения.

https://gcc.godbolt.org/z/91vf1Whrx

struct Vector3 {
    float x;
    float y;
    float z;
};
// Наивная версия векторного произведения
Vector3 naiveCrossProduct(const Vector3& a, const Vector3& b) {
    Vector3 result;
    result.x = a.y * b.z - a.z * b.y;
    result.y = a.z * b.x - a.x * b.z;
    result.z = a.x * b.y - a.y * b.x;
    return result;
}

и 3dnow

Vector3 threeDNowCrossProduct(const Vector3& a, const Vector3& b) {
    Vector3 result;

    __m64 va = _m_from_int(*(int*)&a.x); // a.x | 0
    __m64 vb = _m_from_int(*(int*)&a.y); // a.y | 0
    __m64 vc = _m_from_int(*(int*)&b.y); // b.y | 0
    __m64 vd = _m_from_int(*(int*)&b.x); // b.x | 0

    __m64 temp1 = _m_pfmul(va, vc);         // a.x*b.y | 0
    __m64 temp2 = _m_pfmul(vb, vd);         // a.y*b.x | 0
    __m64 result2 = _m_pfsub(temp1, temp2); // a.x*b.y-a.y*b.x | 0
    memcpy(&result.z, &result2, sizeof(float));

    temp1 = _m_from_int(*(int*)&a.z);  // a.z | 0
    temp2 = _m_from_int(*(int*)&b.z);  // b.z | 0
    result2 = va;                      // a.x | 0
    va = _m_punpckldq(vb, temp1);      // a.y | a.z
    vb = _m_punpckldq(temp1, result2); // a.z | a.x
    temp1 = vc;                        // b.y | 0
    vc = _m_punpckldq(temp2, vd);      // b.z | b.x
    vd = _m_punpckldq(temp1, temp2);   // b.y | b.z

    temp1 = _m_pfmul(va, vc);                // a.y*b.z | a.z*b.x
    temp2 = _m_pfmul(vb, vd);                // a.z*b.y | a.x*b.z
    __m64 result1 = _m_pfsub(temp1, temp2);  // a.y*b.z-a.z*b.y | a.z*b.x-a.x*b.z
    memcpy(&result.x, &result1, sizeof(result1));
    
    _m_femms(); // Завершение работы с MMX/3dnow

    return result;
}
★★★★★
Ответ на: комментарий от lovesan

Про процессор?

Не знаю, у меня 3dnow есть в эмуляторе PCem v17.

Там можно выбрать K6-2.

Для настольгии.

А так, вот вспомнил, про ссылку. Вроде на лоре я её впервые и увидел: https://dtf.ru/life/888434-gollandec-s-1986-goda-upravlyaet-svoim-biznesom-na-kompyutere-atari-st-za-36-let-ustroistvo-ni-razu-ne-slomalos

«Голландец с 1986 года управляет своим бизнесом на компьютере Atari ST — за 36 лет устройство ни разу не сломалось»

fsb4000 ★★★★★
() автор топика

Ну удалили и удалили. Оно уже 13 лет как не поддерживается в железе и хз, где реально использовалось в софте в последнее время.

devl547 ★★★★★
()
Ответ на: комментарий от EXL

Для Quake II (id Tech) был патч 3.19 или 3.20 когда добавлялись 3dnow. Тогда K6-2 сравнивался и даже чуть обгонял Pentium 2 на одинаковой частоте.

Ещё вот что нагуглил про Unreal:

https://github.com/RedPandaProjects/UnrealEngine/blob/master/Source/Render/Src/UnLight.cpp#L582

А так, в 3dmark 2000 и 3dmark 2001 показывалось что он использует 3dnow или SSE если запускать эти тесты на процессоре с 3dnow или с SSE, так что вероятно тоже использовалось.

fsb4000 ★★★★★
() автор топика
Ответ на: комментарий от EXL

Для Quake 3 вот что нагуглил: http://murc.ws/forum/hardware/general-hardware-software/6325-quake3-3dnow-optimizations

whenever i play the Quake 3 test 1.08 or earlier, it detects my CPU during that blue screen as an «AMD 3Dnow! enhanced CPU…», but in Quake3 final, it only detects it as an «x86 Pentium2/MMX» CPU. what’s up with that? can i manually set my CPU as a 3Dnow! CPU? i have a K6-3 400 @ 112x4.0…

так что видимо были оптимизации, но возможно их убрали…

fsb4000 ★★★★★
() автор топика
Ответ на: комментарий от EXL

Был у меня К6-2 в те времена. Покупал с расчетом, что это 3dNow что-то даст, а по итогу P2 был во всём быстрее, т.к. оптимизировали игры только под него.

Loki13 ★★★★★
()
Последнее исправление: Loki13 (всего исправлений: 1)
Ответ на: комментарий от EXL

Да. Наверное.

Я вот такую функцию использую.

bool is_3dnow_supported() {
    int cpu_info[4];

    // Проверяем, поддерживает ли процессор инструкцию CPUID
    __cpuid(cpu_info, 0);
    // Проверяем, что EAX > 0
    if (cpu_info[0] <= 0) {
        return false;
    }

    // Получаем информацию о расширениях процессора
    __cpuid(cpu_info, 0x80000000);

    // Проверяем, что EAX >= 0x80000001
    if (cpu_info[0] < 0x80000001) {
        return false;
    }

    // Получаем информацию о поддерживаемых расширениях
    __cpuid(cpu_info, 0x80000001);

    // Проверяем наличие 3DNow! (бит 31 в EDX)
    return (cpu_info[3] & (1 << 31)) != 0;
}

Вообще есть функция IsProcessorFeaturePresent: Тогда так:

if (IsProcessorFeaturePresent(PF_3DNOW_INSTRUCTIONS_AVAILABLE)) {
  optimized_fun();
} else {
  generic_fun();
}

Но я не пользуюсь IsProcessorFeaturePresent для 3dnow, потому что эта функция из NTKernel. В Windows 98 есть эта функция, но лишь как заглушка(всегда возвращает 0).

https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-isprocessorfeaturepresent

Ещё есть такая страница, где показано как определять все инструкции процессора: https://learn.microsoft.com/en-us/cpp/intrinsics/cpuid-cpuidex?view=msvc-170#example

Но нужно иметь ввиду, что AVX и AVX2 инструкции поддерживаются лишь с Windows 7 SP1, а AVX512 с Windows 10.(операционная система должна знать о новых инструкциях, чтобы сохранять регистры и восстанавливать их при переключении контекста с одного процесса на другой.)

Windows 98SE знает про SSE регистры, так что можно использовать все SSE1, 2, 3, 4.1, 4.2 инструкции.

P.S.

  1. Я для 3dnow использовал __cpuid вместо __cpuidex потому что __cpuidex нет в VS 2005, последней версии компилятора от Microsoft для Windows 98.

  2. Я не совсем понимаю зачем они там добавляют сравнение с вендором, кроме проверки 31 бита в EDX. Вроде этого не требуется, и также процессоры VIA лицензировали у AMD 3dnow…

в этой части кода:

static bool _3DNOW(void) { return CPU_Rep.isAMD_ && CPU_Rep.f_81_EDX_[31]; }
fsb4000 ★★★★★
() автор топика
Последнее исправление: fsb4000 (всего исправлений: 2)
Ответ на: комментарий от EXL

https://github.com/RedPandaProjects/UnrealEngine/blob/403fe5ebdd2a4dd755a7e25b856443af1d770854/Source/Core/Src/UnPlat.cpp#L478-L491

	// Check for K6 3D instructions.
	if( !ParseParam(appCmdLine(),"NOK6") )
	{
		FGlobalPlatform_CPUID( 0x80000000, &A, &B, &C, &D );
		if( A >= 0x80000001 )
		{
			FGlobalPlatform_CPUID( 0x80000001, &A, &B, &C, &D );
			if( D & 0x80000000 )
			{
				strcat( FeatStr, "AMD-3D " );
				GIsK63D=1;
			}
		}
	}
fsb4000 ★★★★★
() автор топика
Ответ на: комментарий от Loki13

В 98 у меня был K6-2 266 с 3dnow, он был дешевле чем P-233MMX, и заметно дешевле чем Celeron 266. Не думаю что 3dnow широко использовался, в unreal наверное, и в дравах для видеокарт voodoo, так в инетах пишут.

Aber ★★★★★
()
Ответ на: комментарий от Loki13

У меня был тоже. Но это было так давно, что я помню всё очень смутно. Разве что материнку Lucky Star ещё помню. А сам проц кстати остался:

EXL ★★★★★
()

@EXL, @LINUX-ORG-RU, @dataman, @firkax

А в clang20 удалят команды MMX. Точнее заменят бекэнд, так что будут вместо них генерироваться SSE2 команды. Хорошо хоть ошибку компиляции выводят, если компилировать MMX код с флагами без поддержки SSE2.

https://gcc.godbolt.org/z/sdzq1P33c

fsb4000 ★★★★★
() автор топика
Ответ на: комментарий от fsb4000

Мой Phenom II X6 это переживёт! И GCC рулит!
Проще говоря, скорее всего будет всё более тормозным да? У шланга уж шибко размашистый выхлоп с кучей телодвижений. А я на бинарном дистрибутиве, я ещё не готов стать гентушником!

Надо найди что-то для обработки видео, в ffmpeg наверное есть или в mpv или в обоих или в связке, пересобрать с шлангом новым и поглядеть в живую будет ли деградация скорости работы.

Конкретно с MMX ещё ладно, сдеалали прозрачно, единственное что для многих будет сюрпризом при дебаге что компиляли одно, а получили другое.

Но в целом они чёта мутят ибо тупо оставить код как есть нини, надо выпилить, а всунуть по сути эмуляцию эт пожалуйста. Непонятно. Так или иначе это их проект, будем уважать их решения и продолжать использовать GCC

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Проще говоря, скорее всего будет всё более тормозным да?

Программы в которых есть оптимизации 3dnow! не скомпилируются новым clang.

Программы в которых есть оптимизации MMX, скомпилируются, но будут падать с ошибкой, о неподдерживаемых инструкциях на процессорах с MMX, но без SSE2, то есть на PentiumMMX, Pentium 2, Pentium 3, AMD K6, AMD Athlon, AMD Athlon XP.

По скорости, это замерять нужно. С одной стороны регистры SSE2 - 128 бит, а MMX - 64 бита. С другой стороны, часть команд MMX будут эмулироваться несколькими командами SSE2.

fsb4000 ★★★★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

Иначе говоря, оно просто работает, пока кто-то специально палки не начинает совать

Был у меня 965Х4, выдохнул после замены на 3900Х. Просто небо и земля, всё летать стало. Я даже не подозревал, что всё было настолько плохо и упиралось в процессор.

Loki13 ★★★★★
()
Ответ на: комментарий от devl547

Да ничего там особо не оптимизировали, у AMD тупо был медленный FPU, а под 3dnow всем лениво было код писать.

Под SSE оптимизировать стало сразу не лень? Я думаю что дело в том что интел неплохо заносил разработчикам компиляторов, а уже венда, даже понятие такое было Wintel.

Loki13 ★★★★★
()
Ответ на: комментарий от Loki13

У интела была в те годы агрессивная реклама из каждого утюга. Многие даже не рассматривали AMD для покупки. «Интел инсайд, идиот аутсайд», всё такое. А когда последние начали делать двухядерники и в связи с этим умножать в маркетинговых названиях на 2 свои частоты в мегагерцах, от этого вообще запахло каким-то разводом)

annulen ★★★★★
()
Последнее исправление: annulen (всего исправлений: 1)
Ответ на: комментарий от Loki13

Я думаю что дело в том что интел неплохо заносил разработчикам компиляторов

Во-первых, MS партнёр Intel, и вряд ли им специально что-то нужно было заносить. А это был ведущий компилятор на тот момент.

Во-вторых, компилятором бинарники оптимизировали под минимально поддерживаемый проц, i586 например. Чтобы у конечного пользователя всё запустилось независимо от компа. А инструкции вроде 3dnow использовались из ассемблера в опциональных кодовых путях, в критичных к производительности вещах вроде видеокодеков.

annulen ★★★★★
()
Ответ на: комментарий от Loki13

Под sse в целом тоже было лень. Вот sse2 уже взлетел.

Ну и особенность того, что 3dnow использовал регистры fpu, а sse имел свои, что быстрее.

devl547 ★★★★★
()
Последнее исправление: devl547 (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

…И это пишут люди в «Development»

нихера так не работает. Ни один вменяемый разработчик или компания не будет писать что-либо или даже поддерживать, под вот такое древнее говно, если ему не будут сыпаться дохериллионы бабла за такие извращения.

Соответственно все старые баги, глюки, и уязвимости - на этом старом говне так и останутся.

Ну и естественно 0 новых фич. Хотите что-либо новое? Ставьте новое железо.

lovesan ★★
()
Ответ на: комментарий от Loki13

Под SSE оптимизировать стало сразу не лень?

SSE/SSE2 компилятор может генерировать сам. А 3dnow/mmx компилятор не генерировал, потому что разработчики компиляторов не осилили в то время расставлять femms или emms для перехода из режима 3dnow/MMX в режим FPU и обратно.

https://gcc.gnu.org/legacy-ml/gcc-patches/2004-12/msg01955.html

Вроде MMX мог генерировать старый Intel компилятор(до того как Intel стал использовать clang).

А весь 3DNow! написан руками.

fsb4000 ★★★★★
() автор топика
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от annulen

У интела всегда была и есть - высокая производительность на одно ядро. Что как было важно программам, так и до сих пор важно, особенно на десктопе, для игрушек и так далее.

lovesan ★★
()
Ответ на: комментарий от LamerOk

А что в ядре делала поддержка 3dnow ?

Если есть дополнительные регистры, то ядро должно гарантировать их правильную очистку и заполнение при переключениях контекста. Если такой поддержки нет, то там может оказаться всё, что угодно.

annulen ★★★★★
()
Ответ на: комментарий от annulen

Ну так это должно быть для любых регистров, которые есть в CPU.

Нагуглилось вот это и там нет никаких признаков, что в ядре так глобально обосрались, как ты рассказываешь.

У тебя там точно журналист никого не изнасиловал?

LamerOk ★★★★★
()
Ответ на: комментарий от annulen

Именно. То есть регистры сохраняются и восстанавливаются, будем надеяться, по-прежнему корректно. Выкинули оптимизации под конкретные камни.

LamerOk ★★★★★
()
Ответ на: комментарий от lovesan

Важно неосиляторам распараллеливания. Подавляющее большинство всех cpu-жрущих алгоритмов прекрасно параллелятся. Но для этого недостаточно магической опции компилятора а надо мозг применять.

firkax ★★★★★
()
Ответ на: комментарий от lovesan

…И это пишут люди в «Development»

В моём сообщении на две строчки технической части больше чем в твоём, у тебя одни эмоции

нихера так не работает.

Работает, у меня бинарный дистрибутив с почти распоследними программами и всё за исключением пары исключений просто работает. Это объективная реальность, подавляющему большинству программных пакетов никакие особенности платформы ненужны и чисто технически нет никакой разницы на уровне исполнения это камень 2024го года или это камень 2012го года. Конечно всё имеет свой предел. Но технически всё замечательно работает, прямо здесь и сейчас.

Ни один вменяемый разработчик или компания не будет писать что-либо или даже поддерживать

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

если ему не будут сыпаться дохериллионы бабла за такие извращения.

Что за лицемерие? То есть если по твоему кто-то решил сделать охват большей аудитории и выполняет оптимизированные спец сборки для определённого софта (замечу что для современных фич тоже нужны спец сборки которые мало где будут работать) то это невменяемость, а если денежкой у носа помахали, то ой всё ладно сейчас я вам всё сделаю? Давай уж либо ты за адекватность (в своём понимании) или за экономическую целесообразность.

Соответственно все старые баги, глюки, и уязвимости - на этом старом говне так и останутся.

Ой, а новых багов то нету, все процессоры как решето.

Ну и естественно 0 новых фич. Хотите что-либо новое? Ставьте новое железо.

Нет не 0. Ты врёшь. А если новое требует новых технологических решений для исполнения на железе от железа то да, в иных случаях нет.

Короче, мне интересно новое железо и не держусь за старое, но использую его, просто я понимаю что в неких технологических границах разницы физически между ними просто нет, ибо стандарты позволяют программам просто работать и там и там. Вот и всё.

P.S. Конечно это всё в рамках применения с специализации железа и софта, у меня это домашний ПеКа. Если захочется специализированных фичей завязанных на железе, то само собой нужно соответствующее железо

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

x86 набор одинаков для любого x86 совместимого проца

Есть x86-64-v{1,2,3,4}

Ну так это сейчас так и есть, более того те самые разработчики и компании специально не используют фичи твоего распоследнего процессора и они у тебя тупо простаивают.

В RHEL 10 минимально поддерживаемая архитектура будет x86-64-v3

никакой разницы на уровне исполнения это камень 2024го года или это камень 2012го года

Пишут x86-64-v3 инструкции у intel процессоров появились в 2013.

MOPKOBKA ★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 1)
Ответ на: комментарий от MOPKOBKA

Есть x86-64-v{1,2,3,4}

Да, это разные стандарты (разное количество наборов обязательных расширений инструкций). Отражающие разное железо, разное железо в рамках одного стандарта одинаково.

В RHEL 10 минимально поддерживаемая архитектура будет x86-64-v3

Ну значит так, всё будет зависеть от сборки.

Пишут x86-64-v3 инструкции у intel процессоров появились в 2013.

Ладно. Так или иначе, уже сейчас можно собирать софт так что он не будет работать на моём Phenom вообще, но этого не делают и у большиства сейчас если и есть набор инструкций x86-64-v3 то они не используются и с ними мало что собирается.

Я не знаю что будет потом, мне пофигу на RH, я понимаю что рано или поздно начнёт собирать с принудительными включениями SIMD такими что отвалятся старые процессоры (хотя они замечательно и не хуже новых могут исполнять те же программы собранные просто без спец оптимизаций), но сейчас, сейчас всё просто работает, под всё я подразумеваю всё жизненно важное для меня, то что пару эмуляторов и игр не работает, ну ладно.

Повторюсь, я не «ха**ой нам не нужены ваши новые процессоры», просто когда у меня всё работает, а мне в лицо тычат что у меня ничего не работает и иди купи новое, потому что это новое это такое себе. Ну новое и новое. В целом железо есть очень разное, с очень разными наборами фичей, сейчас есть кучи архитектур с разными наборами фичей между ними, тут понятие новое/старое уже теряется, тут проявляется просто разное.

Благо СПО и всё такое, если нужную мне программу принуительно будут собирать так что она не будет работать на моём камне, ну пересоберу. Если это будет целый дистрибутив включая загрузчик, да будет сложнее и проще обновить сам камень. Короче, не нужно крайностей. Суть проста, есть разные наборы инструкций включая и у современных процессоров, можно на оджном новом камне собрать так что не будет работать на другом, именно поэтому собирается так чтобы работало побольше где, а фичи, ну всему своё время.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от LamerOk

Стесняюсь спросить, а что ты пишешь для Windows 98 ?

Просто микротесты быстрых программ.

Просто у меня наверное диаметрально противоположное определение быстрой программы.

Для меня программа является быстрой если она выполняет свою функцию при минимальных ресурсах.

Например: «Ничего себе это такая быстрая программа, она работает хорошо даже на Pentium III 1400Mhz.»

У большинства нынешних разработчиков определение быстрой программы, это то сколько ресурсов они утилизировали.

Например, я помню новость: «Супер быстрый эмулятор терминала на Rust, использует для отрисовки Vulkan.» Для меня это звучит как: «Супер тормозной эмулятор терминала, который не запустится даже на GeForce GTX 580, требует минимум Geforce GT 6xx.»

Или ещё часто любят говорить, что их супер быстрые программы работают в 8 потоков, для того что в 199x работало на 1 потоке.

И т.д.

Понятно что это хобби. На работе Linux, docker, кубер и прочий тормозной бред, который сейчас применяется.

fsb4000 ★★★★★
() автор топика
Ответ на: комментарий от fsb4000

Для меня программа является быстрой если она выполняет свою функцию при минимальных ресурсах.

А зачем для этого нужен именно 98 ? Почему не подходит, к примеру, ХР?

LamerOk ★★★★★
()