2012-06-20 40 views
8

MS Visual C++ hỗ trợ 2 hương vị của hướng dẫn popcnt trên CPU với SSE4.2:Sự khác nhau giữa __popcnt() và _mm_popcnt_u32() là gì?

  1. __popcnt()
  2. _mm_popcnt_u32()

Sự khác biệt duy nhất tôi thấy được rằng các tài liệu cho __popcnt() được đánh dấu là "Microsoft Specific" và _mm_popcnt_u32()seems to be an intrinsic command name (không dành riêng cho MS).

Đây có phải là sự khác biệt duy nhất, nơi MS __popcnt() chỉ cần gọi HW _mm_popcnt_u32()?

Trả lời

11

Nội trang __popcnt *() dành cho hướng dẫn Thao tác bit nâng cao của AMD (ABM). Xem http://blogs.amd.com/developer/2007/09/26/barcelona-processor-feature-advanced-bit-manipulation-abm/

Nội dung _mm_popcnt_u *() dành cho việc triển khai của Intel, không phải là một phần của SSE4.2 mỗi lần, nhưng được triển khai cùng một lúc. Xem http://en.wikipedia.org/wiki/SSE4#POPCNT_and_LZCNT

Theo http://chessprogramming.wikispaces.com/Population+Count, cả hai triển khai đều tương thích nhị phân, bất chấp tên nội tại khác nhau của chúng.

của Intel architecture manual bang rằng:

Trước khi một ứng dụng cố gắng sử dụng các hướng dẫn POPCNT, nó phải xem xét rằng bộ vi xử lý hỗ trợ SSE4.2 (nếu CPUID.01H: ECX.SSE4_2 [chút 20] = 1) và POPCNT (nếu CPUID.01H: ECX.POPCNT [bit 23] = 1).

AMD AMD64 Architecture Programmer's Manual Volume 3: General Purpose and System Instructions nói

Hỗ trợ cho các hướng dẫn POPCNT được chỉ định bởi ECX cắn 23 (POPCNT) như được trả về bởi CPUID chức năng 0000_0001h. Phần mềm PHẢI kiểm tra bit CPUID một lần cho mỗi chương trình hoặc khởi tạo thư viện trước khi sử dụng lệnh POPCNT hoặc hành vi không nhất quán có thể xảy ra.

Tôi không thể biết lý do tại sao popcnt yêu cầu sự hiện diện của SSE4.2, vì vậy tôi nghĩ rằng việc kiểm tra bit 23 của ECX là đủ để xác định sự hiện diện của popcnt.

AMD AMD, CPU AMD đầu tiên có popcnt, không thực hiện đầy đủ SSE4, vì vậy có thể hướng dẫn kiến ​​trúc của Intel đề xuất phương pháp xác định sự hiện diện sẽ hoạt động trên CPU Intel và không thành công.

+0

Vì vậy, có sự khác biệt về thời điểm sử dụng từng phần mềm không? Nên một bit cpuid khác nhau được kiểm tra? Nếu tôi muốn viết Intel/AMD agnostic cwhat mà vẫn sử dụng lệnh, tôi nên làm gì? –

+1

Nó không xuất hiện rằng chúng khác nhau hoặc không tương thích. Xem câu trả lời đã chỉnh sửa của tôi ở trên. – mattst88

+0

Câu trả lời hay. Cảm ơn. –

Các vấn đề liên quan