Làm cách nào để kiểm tra xem biến số __m128i
có bất kỳ giá trị không đồng bộ nào trên bộ xử lý SSE-2 và cũ hơn không?Biến số __m128i có bằng không?
Trả lời
Trong SSE2 bạn có thể làm:
__m128i zero = _mm_setzero_si128();
if(_mm_movemask_epi8(_mm_cmpeq_epi32(x,zero)) == 0xFFFF)
{
//the code...
}
này sẽ kiểm tra Bốn int của vs zero sau đó trả về một mặt nạ cho từng byte, vì vậy bit offsets lại mỗi cái tương ứng int
sẽ là 0, 4, 8 & 12, nhưng các thử nghiệm trên sẽ bắt nếu bất kỳ bit được thiết lập, sau đó nếu bạn bảo vệ mặt nạ bạn có thể làm việc với các phần hạt mịn hơn trực tiếp nếu cần thiết.
+1, nó tốt hơn tôi. :) Tôi chưa bao giờ sử dụng lệnh movemask vì vậy tôi không biết bạn có thể làm điều đó. XD – Mysticial
+1 giải pháp nhỏ gọn nhất mà tôi từng thấy, cảm ơn! – Mehrdad
Có một lỗi trong câu trả lời tuyệt vời khác - nếu bạn đang kiểm tra tất cả các số không, nó phải là 'if (_mm_movemask_epi8 (_mm_cmpeq_epi32 (x, zero)) == 0xFFFF)'. Điều này là do '_mm_cmpeq_epi32' đặt int thành tất cả 1, không phải tất cả 0, nếu nó bằng 0, và sau đó' _mm_movemask_epi8' đặt 16 bit đầu tiên dựa trên bit quan trọng nhất của mỗi byte trong đối số. Hy vọng rằng tác giả có thể chỉnh sửa câu trả lời - tôi đã thử nhưng đã bị từ chối. – FarmerBob
Vì mục đích hoàn chỉnh, với SSE4 người ta có thể sử dụng _mm_testz_si128.
const bool isAllZero = _mm_testz_si128(a,a);
Lưu ý rằng đây là đúng khi tất cả các bit là zero.
Điều này thực sự nhanh hơn một chút và không cần đăng ký tất cả 0 để kiểm tra. 'ptest' /' jz' là 2 + 1 uop (không macro-fuse). 'pcmpeq' (1uop) /' pmovmsk' (1uop)/'và 0xffff' (1uop) /' cmp 0xffff/je' (1uop). Nếu bạn đang thử nghiệm trường hợp khác (* bất kỳ * phần tử không, thay vì * tất cả * phần tử không), chúng sẽ xấp xỉ hiệu suất tương tự trên các CPU Intel và AMD hiện tại: 'ptest' /' jnz' (3 uops) vs 'pcmpeq' /' pmovmsk'/'test/jnz' (3 uops). –
@PeterCordes Thế còn, trong trường hợp đó, có một bộ đăng ký ở tất cả, và sử dụng '_mm_testc_si128'? Một cái gì đó như 'const bool atLeastOneZero = _mm_testc_si128 (a, allOnes)' – Antonio
Một lần nữa, 'ptest' hơi nhanh hơn. Để làm điều đó mà không có 'ptest', bạn sẽ' pcmpeq' so với tất cả các vector, và sau đó tiến hành chính xác cùng một chuỗi để kiểm tra xem tất cả các phần tử có khớp nhau hay không. Việc kiểm tra tất cả 0 hoặc tất cả-một với 'pcmpeq' giống như kiểm tra == đối với bất kỳ mẫu nào khác, ngoại trừ các hằng số dễ tạo ra hơn khi đang bay (' pxor same, same' hoặc 'pcmpeqw same, cùng '). –
- 1. in một biến __m128i
- 2. Tải hình động R.Drawable bằng biến số
- 3. Truy cập một biến bằng cách sử dụng một chuỗi có chứa tên biến số
- 4. Có cách nào để chuyển biến số php sang trang khác bằng nút (html/php) không?
- 5. Cách ngắn nhất để kiểm tra xem biến có chứa số nguyên dương bằng PHP không?
- 6. Tôi có thể có một số biến số tham số chung không?
- 7. Đối số có độ dài bằng không
- 8. Biến tĩnh có nên được thay thế bằng enums không?
- 9. Có cách nào để truy cập biến javascript bằng chuỗi có chứa tên biến không?
- 10. Có thể ghi số nguyên bằng số không bằng các biểu thức chính quy không?
- 11. Các mẫu biến thể không có tham số chức năng
- 12. Bộ chọn jQuery có biến số
- 13. Biến thể hiện so với biến thông số? Có tranh luận nào không?
- 14. mysql "không phải biến số hoặc biến giả MỚI"
- 15. Mở danh sách đối số bằng mẫu biến thể
- 16. Nhận giá trị thuộc tính xml SQL bằng biến số
- 17. Thay thế chuỗi trong tập lệnh shell bằng biến số
- 18. Tăng đối số giữ chỗ liên kết bằng số đối số Mẫu biến thể
- 19. C# có hỗ trợ một số biến đối số hay không và làm cách nào?
- 20. Có tốt hơn khi sử dụng các số nguyên làm biến số vòng lặp không?
- 21. Có thể chụp thông số bằng Google Mock (gmock) không?
- 22. Có thể nhóm các biến $ _POST không?
- 23. chuyển số biến số của đối số
- 24. Sử dụng biến chuỗi ** kwargs làm đối số có tên
- 25. Mockito sử dụng đối số đối sánh khi gọi phương thức có số biến đối số
- 26. Tôi có thể có biến số gia tăng trong LINQ không?
- 27. Java có hỗ trợ các biến biến không?
- 28. Gán blocktrans cho biến số
- 29. Có cách nào để xử lý một số biến số tham số trong một lớp mẫu không?
- 30. PHP $ _REQUEST Biến số
Bạn có nghĩa là một bit khác không hoặc một phần tử số nguyên 8/16/32-bit? –
@BrettHale: Tôi đang thử nghiệm để xem liệu chúng có bằng không. – Mehrdad