Das Schreiben in Assembler würde Ihnen keine magische Geschwindigkeitssteigerung bringen, da Sie aufgrund der Menge an Details (Registerzuordnung usw.) wahrscheinlich den trivialsten Algorithmus aller Zeiten schreiben werden.
Bei modernen (nach den 70er und 80er Jahren ausgelesenen) Prozessoren liefert die Baugruppe nicht genügend Details, um zu wissen, was vor sich geht (das heißt, bei den meisten Prozessoren). Moderne PUs (CPUs und GPUs) sind in Bezug auf Terminierungsanweisungen recht komplex. Wenn Sie die Grundlagen der Assemblierung (oder Pseudoassemblierung) kennen, können Sie Bücher / Kurse zur Computerarchitektur verstehen, die weitere Kenntnisse vermitteln (Caches, nicht ordnungsgemäße Ausführung, MMU usw.). Normalerweise müssen Sie keine komplexen ISA-Kenntnisse haben, um sie zu verstehen (MIPS 5 ist ein sehr beliebtes IIRC).
Warum Prozessor verstehen? Es könnte Ihnen viel mehr Verständnis geben, was los ist. Angenommen, Sie schreiben die Matrixmultiplikation auf naive Weise:
for i from 0 to N
for j from 0 to N
for k from 0 to N
A[i][j] += B[i][k] + C[k][j]
Es kann für Ihren Zweck "gut genug" sein (wenn es sich um eine 4x4-Matrix handelt, kann es ohnehin zu Vektoranweisungen kompiliert werden). Es gibt jedoch einige wichtige Programme, mit denen Sie massive Arrays kompilieren - wie können Sie sie optimieren? Wenn Sie den Code in Assembler schreiben, können Sie einige Prozent der Verbesserungen erzielen (es sei denn, Sie würden wie die meisten anderen tun - auch auf naive Weise, wenn Sie die Register nicht ausnutzen, ständig in den Speicher laden / speichern und tatsächlich ein langsameres Programm als in HL-Sprache haben). .
Sie können jedoch die Zeilen umkehren und die Leistung auf magische Weise steigern (warum? Ich lasse es als "Hausaufgabe") - IIRC kann in Abhängigkeit von verschiedenen Faktoren für große Matrizen sogar das 10-fache betragen.
for i from 0 to N
for k from 0 to N
for j from 0 to N
A[i][j] += B[i][k] + C[k][j]
Das heißt, es wird daran gearbeitet, dass Compiler dies tun können ( Graphit für gcc und Polly für alles, was LLVM verwendet). Sie können es sogar in umwandeln (Entschuldigung - ich schreibe Blockieren aus dem Speicher):
for i from 0 to N
for K from 0 to N/n
for J from 0 to N/n
for kk from 0 to n
for jj from 0 to n
k = K*n + kk
j = J*n + jj
A[i][j] += B[i][k] + C[k][j]
Zusammenfassend lässt sich sagen, dass Sie mit den Grundlagen einer Baugruppe verschiedene Details aus dem Prozessordesign kennenlernen können, mit denen Sie schnellere Programme schreiben können. Es kann hilfreich sein, die Unterschiede zwischen den Architekturen RISC / CISC oder VLIW / Vektorprozessor / SIMD / ... zu kennen. Allerdings würde ich nicht mit x86 anfangen, da sie in der Regel recht kompliziert sind (möglicherweise auch ARM) - zu wissen, was ein Register usw. ist, reicht meiner Meinung nach für den Start aus.