2 điểm bởi GN⁺ 2024-10-07 | 1 bình luận | Chia sẻ qua WhatsApp

Đối tượng độc giả

  • Những người quan tâm đến lập trình CPU SIMD
  • Các lập trình viên Amiga muốn biết cách tính giá trị blitter "minterm"

Lệnh toán tử tam phân logic bit AVX-512

  • Lấy cảm hứng từ bài thuyết trình của Tom Forsyth về thiết kế ISA AVX-512
  • Lệnh vpternlogd thực hiện phép toán logic bit bằng cách dùng ba nguồn đầu vào
  • Có thể dùng thanh ghi 512-bit làm đầu vào để thực hiện các phép logic phức tạp chỉ với một lệnh duy nhất
  • Xác định phép toán logic bit cụ thể bằng giá trị tức thời 8-bit

Chip tùy biến blitter của Amiga

  • Máy tính thập niên 1980 có các chip tùy biến để xử lý đồ họa
  • Chip blitter của Commodore Amiga 500 di chuyển đồ họa bitmap và thực hiện các phép logic
  • Điều khiển tổ hợp logic bằng cách thiết lập "minterm", một giá trị 8-bit
  • Nhiều lập trình viên Amiga trước đây không biết cách tính giá trị minterm

Cách tính giá trị minterm một cách dễ dàng

  • Không cần hiểu giá trị 8-bit như một tập hợp các toán tử logic
  • Chỉ cần xem nó như một bảng tra cứu
  • Ví dụ, có thể đặt kết quả bằng 1 khi chính xác hai trong ba bit đầu vào là 1
  • Đọc giá trị 8-bit từ dưới lên trên sẽ thu được 0x68

Một sự trùng hợp thú vị

  • Giá trị minterm 0xE2 thường dùng trên Amiga được dùng để render sprite 2D có mặt nạ
  • Việc tài liệu Intel chọn 0xE2 làm ví dụ cho giá trị #imm8 có thể chỉ là một sự trùng hợp

Kết luận

  • Có thể trong nhóm viết ví dụ tài liệu của Intel có người hâm mộ Amiga
  • Một chút ảnh hưởng retro cũng chẳng có gì xấu

Tóm tắt của GN⁺

  • Lệnh vpternlogd của AVX-512 là một công cụ mạnh, có thể thực hiện các phép logic bit phức tạp chỉ với một lệnh
  • Sự tương đồng với chip blitter của Amiga khá thú vị nếu nhìn từ góc độ lịch sử
  • Bài viết này cho thấy mối liên hệ giữa lập trình hiện đại và công nghệ retro, đồng thời mang lại góc nhìn hữu ích cho lập trình viên
  • Những dự án có chức năng tương tự bao gồm AVX-512 của Intel và kiến trúc Zen của AMD

1 bình luận

 
GN⁺ 2024-10-07
Ý kiến trên Hacker News
  • Có một cách đơn giản để tính một biểu thức cụ thể. Ví dụ, nếu muốn tính (NOT A) OR ((NOT B) XOR (C AND A)), có thể viết biểu thức bằng các hằng _MM_TERNLOG_A, _MM_TERNLOG_B, _MM_TERNLOG_C

    • Trong GCC và Clang, có thể tính ngay bằng các hằng được định nghĩa trong header intrinsic
    • Trong MSVC, phải tự định nghĩa các hằng trực tiếp
  • Ban đầu tôi tưởng tiêu đề nói rằng lệnh không hoạt động đúng, nhưng thực ra nó đang giải thích cách lệnh hoạt động

  • Tôi từng cố hiểu manual phần cứng nhưng thất bại. Sau này ở đại học tôi lại được A+ môn logic tính toán

  • "Logic tam trị" thường có nghĩa là logic với ba giá trị chân lý, nhưng bài này đang nói về một lệnh compiler xử lý mọi cổng logic nhị phân với ba đầu vào

  • Hàm ví dụ "E2" trong tài liệu là hàm Boolean cơ bản nhất với 3 đầu vào, được gọi là MUX chọn C khi A bằng B. Nó có tính phổ dụng

  • Nó dùng bảng tra cứu (LUT), giống hệt cách FPGA hiện thực các hàm logic tùy ý

  • Có vẻ hồi đại học tôi đã rất tập trung trong môn toán rời rạc

  • Nếu tìm VPTERNLOG trên sandpile.org, có thể thấy các kế hoạch trước đây của Intel liên quan đến byte và word masking (AVX512BITALG2)

  • Nvidia SASS cũng có một lệnh tương tự (LOP3.LUT)

  • Một ví dụ khác về việc đóng gói phép toán bit thành số nguyên là mã GDI ROP của win32