Det fungerar inte riktigt så längre. Om man skulle ge uppgiften att skriva något i assembler i stället för t.ex. C eller C++ skulle minst nio av tio skriva något som är långsammare än vad en modern kompilator producerar.
Är bara väldigt specifika fall man får någon vinst från att skriva assembler direkt, men även dessa fall hanterar man idag typiskt via s.k. intrinsics (exempel för x86 SSE/AVX och ARM NEON). Intrinsics gör att användandet av specifika assemblerinstruktioner uppför sig som C-funktioner, det är långt enklare att få saker korrekt ihop med övrig kod + är mindre dålig mot optimeringspassen vid kompilering.
Assembler-block i C/C++ kod måste hanteras som svarta lådor som i praktiken kan göra vad som helst, något som förhindrar en del optimeringar i kod som använder assembler -> sannolikheten att det i slutändan är snabbare är ännu mindre.
Sedan skriver man inte assembler i GPUer. Hela poängen med CUDA/OpenCL är ju att man ska kunna skriva relativt "normal" C-kod. Senaste versionerna av CUDA tillåter ju även användning av C++, från och med Volta finns alla funktioner i GPUn för att man ska kunna använda sig av standardversionen av ISO C11 och ISO C++17.
Varje sig människor eller ens kompilatorer är speciellt framgångsrika att optimera för specifika mikroarkitekturer. Moderna CPUer är helt enkelt så bra på att hantera maskinkod så som den typiskt genereras från kompilatorer. Ett exempel på hur det inte blir som man tänk sig är en diskussion om att "-march=znver1" i genomsnitt ger 0-3 % sämre prestanda jämfört med "-march=haswell" när man kör på just Zen.
0-3 % är en irrelevant skillnad, men skillnaden har verifierats av tillräckligt många för att det inte borde vara slumpen. D.v.s. när man optimerar för vara som borde vara optimalt för Zen visar det sig att en människa (för det är en människa som beskrivit hur det borde förhålla sig här) stjälper mer än hjälper här.
Har sett liknande fenomen på Intel CPUer, d.v.s att kompilera med t.ex. "-march=core2" kan ibland ge bättre resultat jämfört med "-march=skylake" trots att det körs på en Skylake. En egentliga poäng jag ser med "-march=xxx" är egentligen att låsa upp intrinsics (fast det kan göras explicit också). T.ex. krävs ju en viss nivå för att AVX-intrinsics ska gå att använda.