2 คะแนน โดย GN⁺ 2024-10-07 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

ผู้อ่านเป้าหมาย

  • ผู้ที่สนใจการเขียนโปรแกรม CPU แบบ SIMD
  • โปรแกรมเมอร์ Amiga ที่อยากรู้วิธีคำนวณค่า blitter แบบ "minterm"

คำสั่งปฏิบัติการตรรกะแบบไตรภาคระดับบิตของ AVX-512

  • ได้แรงบันดาลใจจากการบรรยายของ Tom Forsyth เกี่ยวกับการออกแบบ ISA ของ AVX-512
  • คำสั่ง vpternlogd เป็นคำสั่งที่ใช้แหล่งอินพุตสามตัวเพื่อทำปฏิบัติการตรรกะระดับบิต
  • สามารถใช้งานรีจิสเตอร์ 512 บิตเป็นอินพุต เพื่อทำปฏิบัติการตรรกะที่ซับซ้อนด้วยคำสั่งเดียว
  • ใช้ค่า immediate 8 บิตเพื่อกำหนดปฏิบัติการตรรกะระดับบิตอย่างเจาะจง

ชิปคัสตอม blitter ของ Amiga

  • คอมพิวเตอร์ในยุค 1980 มีชิปคัสตอมสำหรับประมวลผลกราฟิก
  • ชิป blitter ของ Commodore Amiga 500 ใช้ย้ายกราฟิกแบบบิตแมปและทำปฏิบัติการตรรกะ
  • ควบคุมการผสมตรรกะด้วยการตั้งค่า "minterm" ซึ่งเป็นค่า 8 บิต
  • โปรแกรมเมอร์ Amiga จำนวนมากไม่รู้วิธีคำนวณค่า minterm

วิธีคำนวณค่า minterm แบบง่าย

  • ไม่จำเป็นต้องเข้าใจค่า 8 บิตนี้เป็นชุดของตัวดำเนินการตรรกะ
  • สามารถมองว่าเป็น ตารางค้นหาอย่างง่าย ได้เลย
  • ตัวอย่างเช่น ตั้งค่าให้ผลลัพธ์เป็น 1 เมื่อในบิตอินพุตทั้งสามมีค่า 1 อยู่พอดีสองบิต
  • อ่านค่า 8 บิตจากล่างขึ้นบนจะได้ 0x68

ความบังเอิญที่น่าสนุก

  • ค่า minterm 0xE2 ที่ใช้บ่อยบน Amiga ถูกใช้สำหรับการเรนเดอร์สไปรต์ 2D แบบมีมาสก์
  • การที่เอกสารของ Intel เลือก 0xE2 เป็นตัวอย่างของค่า #imm8 อาจเป็นเพียงความบังเอิญ

บทสรุป

  • อาจมีแฟน Amiga อยู่ในทีมที่ทำตัวอย่างเอกสารของ Intel
  • กลิ่นอายย้อนยุคสักหน่อยก็ไม่ใช่เรื่องแย่

สรุปโดย GN⁺

  • คำสั่ง vpternlogd ของ AVX-512 เป็นเครื่องมือทรงพลังที่สามารถทำปฏิบัติการตรรกะระดับบิตอันซับซ้อนได้ด้วยคำสั่งเดียว
  • ความคล้ายกับชิป blitter ของ Amiga น่าสนใจในมุมมองทางประวัติศาสตร์
  • บทความนี้แสดงให้เห็นความเชื่อมโยงระหว่างการเขียนโปรแกรมสมัยใหม่กับเทคโนโลยีย้อนยุค และมอบมุมมองที่เป็นประโยชน์ให้โปรแกรมเมอร์
  • โครงการที่มีความสามารถคล้ายกัน ได้แก่ AVX-512 ของ Intel และสถาปัตยกรรม Zen ของ AMD

1 ความคิดเห็น

 
GN⁺ 2024-10-07
ความคิดเห็นบน Hacker News
  • มีวิธีง่าย ๆ ในการคำนวณนิพจน์บางแบบ ตัวอย่างเช่น ถ้าต้องการคำนวณ (NOT A) OR ((NOT B) XOR (C AND A)) ก็สามารถเขียนนิพจน์โดยใช้ค่าคงที่ _MM_TERNLOG_A, _MM_TERNLOG_B, _MM_TERNLOG_C ได้

    • ใน GCC และ Clang สามารถคำนวณได้ทันทีโดยใช้ค่าคงที่ที่นิยามไว้ใน intrinsic header
    • ใน MSVC ต้องนิยามค่าคงที่เองโดยตรง
  • ตอนแรกนึกว่าหัวข้อบอกว่าคำสั่งมีปัญหาและทำงานไม่ถูกต้อง แต่จริง ๆ แล้วเป็นการอธิบายวิธีการทำงานของมัน

  • เคยพยายามทำความเข้าใจฮาร์ดแวร์แมนนวลแต่ไม่สำเร็จ ต่อมาจึงได้ A+ ในวิชาตรรกะเชิงคำนวณตอนมหาวิทยาลัย

  • โดยปกติ "ตรรกะสามค่า" มักหมายถึงตรรกะที่มีค่าความจริงสามค่า แต่บทความนี้พูดถึงคำสั่งคอมไพเลอร์ที่จัดการเกตตรรกะทวิภาคทั้งหมดที่มีอินพุตสามตัว

  • ฟังก์ชันตัวอย่าง "E2" ในเอกสารเป็นฟังก์ชันบูลีนพื้นฐานที่สุดแบบหนึ่งที่มีอินพุต 3 ตัว โดยเป็น MUX ที่เลือก C เมื่อ A เท่ากับ B ซึ่งเป็นฟังก์ชันสากล

  • ใช้ตารางค้นหา (LUT) เช่นเดียวกับวิธีที่ FPGA ใช้เพื่อทำฟังก์ชันตรรกะตามต้องการ

  • ดูเหมือนว่าตอนเรียนปริญญาตรีจะตั้งใจเรียนวิชาคณิตศาสตร์ไม่ต่อเนื่องมากทีเดียว

  • ถ้าไปค้นหา VPTERNLOG บน sandpile.org จะเห็นแผนเก่า ๆ ของ Intel ที่เกี่ยวกับการมาสก์ไบต์และเวิร์ด (AVX512BITALG2)

  • ใน Nvidia SASS ก็มีคำสั่งคล้ายกันอยู่ด้วย (LOP3.LUT)

  • อีกตัวอย่างหนึ่งของการแพ็กการดำเนินการระดับบิตเป็นจำนวนเต็มคือโค้ด GDI ROP ของ win32