어셈블리에 쓰면 세부 정보의 양 (레지스터 할당 등)으로 인해 속도가 크게 향상되지 않습니다. 아마도 가장 사소한 알고리즘을 작성하게 될 것입니다.
또한 최신 (70-80 년대 이후에 읽은 설계) 프로세서 어셈블리를 사용하면 현재 진행중인 작업 (즉, 대부분의 프로세서)을 알 수있는 충분한 세부 정보가 제공되지 않습니다. 최신 PU (CPU 및 GPU)는 예약 명령이 진행되는 한 상당히 복잡합니다. 조립의 기초 (또는 의사 조립)를 알면 컴퓨터 아키텍처 서적 / 코스를 이해하여 추가 지식 (캐시, 고장난 실행, MMU 등)을 제공 할 수 있습니다. 일반적으로 복잡한 ISA를 이해하기 위해 복잡한 ISA를 알 필요는 없습니다 (MIPS 5는 매우 인기있는 IIRC입니다).
왜 프로세서를 이해합니까? 무슨 일이 일어나고 있는지 더 많이 이해할 수 있습니다. 순진한 방식으로 행렬 곱셈을 작성한다고 가정 해 봅시다.
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]
그것은 목적에 따라 '충분히'좋을 수도 있습니다 (4x4 행렬 인 경우 어쨌든 명령어를 벡터로 컴파일 할 수 있음). 그러나 대규모 배열을 컴파일 할 때 매우 중요한 프로그램이 있습니다-최적화 방법? 어셈블리에서 코드를 작성하면 몇 %의 향상이있을 수 있습니다 (대부분의 사람들이하는 것처럼-순진한 방식으로 레지스터 활용률 저하, 메모리로드 / 저장 및 HL 언어에서 느린 프로그램 효과를 갖는) .
그러나 큰 행렬에 대한 다양한 요인에 따라 IIRC는 10 배가 될 수 있습니다.
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]
즉, 컴파일러 ( gcc의 흑연 및 LLVM을 사용하는 모든 것에 대한 Polly) 를 수행 할 수있는 컴파일러에 대한 작업이 있습니다 . 그들은 심지어 그것을 변환 할 수 있습니다 (죄송합니다-메모리에서 차단을 쓰고 있습니다) :
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]
요약하면-어셈블리의 기본 사항을 알면 프로세서 디자인에서 다양한 '세부 사항'을 파고 들어 더 빠른 프로그램을 작성할 수 있습니다. RISC / CISC 또는 VLIW / 벡터 프로세서 / SIMD / ... 아키텍처의 차이점을 아는 것이 좋습니다. 그러나 x86으로 시작하지는 않을 것입니다 (아마도 ARM도 가능합니다). 레지스터 등이 무엇인지 아는 것으로 시작하기에 충분합니다.