Tôi có biểu thức boolean mà tôi đã quản lý để triển khai trong SSE2. Bây giờ tôi đã có thể muốn thử thực hiện nó trong AVX khai thác một yếu tố bổ sung 2 trong sự gia tăng song song (từ 128 bit SIMD loại 256). Tuy nhiên, AVX không hỗ trợ hoạt động số nguyên (mà AVX2 làm, nhưng tôi đang làm việc trên một bộ xử lý Sandy Bridge vì vậy nó không phải là một tùy chọn hiện tại). Tuy nhiên, vì có AVX intrinsics for bitwise operations. Tôi figured tôi có thể làm cho một thử bằng cách chỉ cần chuyển đổi các loại số nguyên của tôi để các loại phao và xem nếu nó hoạt động.Có cách nào để mô phỏng các hoạt động bitwise số nguyên cho các loại _m256 trên AVX không?
Thử nghiệm đầu tiên là một thành công:
__m256 ones = _mm256_set_ps(1,1,1,1,1,1,1,1);
__m256 twos = _mm256_set_ps(2,2,2,2,2,2,2,2);
__m256 result = _mm256_and_ps(ones, twos);
Tôi guetting tất cả 0 như tôi đang nghĩ đến. Simularly AND'ing twos thay vào đó tôi nhận được một kết quả của 2. Nhưng khi cố gắng 11 XOR 4 cho phù hợp:
__m256 elevens = _mm256_set_ps(11,11,11,11,11,11,11,11);
__m256 fours = _mm256_set_ps(4,4,4,4,4,4,4,4);
__m256 result2 = _mm256_xor_ps(elevens, fours);
Kết quả là 6.46e-46 (tức là gần 0) chứ không phải 15. Simularly làm 11 HOẶC 4 cho tôi một giá trị 22 và không phải là 15 như nó phải được. Tôi không hiểu tại sao điều này lại xảy ra. Nó là một lỗi hoặc một số cấu hình tôi đang thiếu? Tôi đã thực sự mong đợi giả thuyết của tôi làm việc với phao như thể chúng là số nguyên không hoạt động vì số nguyên được khởi tạo cho một giá trị float có thể không thực sự là giá trị chính xác mà là xấp xỉ gần đúng. Nhưng ngay cả sau đó, tôi ngạc nhiên bởi kết quả tôi nhận được.
Có ai có giải pháp cho vấn đề này hay tôi phải nâng cấp CPU của mình để nhận hỗ trợ AVX2 cho phép điều này?
Có vẻ như bạn đang in một số nguyên làm phao để nhận được 6.46e-46. Bạn có chắc các định dạng định dạng 'printf()' của bạn là chính xác không? –
Tôi không in. Tôi vừa kiểm tra giá trị trong trình gỡ rối Visual Studio. – Toby999