Tôi đang lập trình, cho nền tảng C, một thư viện để thực hiện nhiều thứ khác nhau cho hình ảnh webcam. Tất cả các hoạt động là trên mỗi pixel và có khả năng song song cao - ví dụ như áp dụng các mặt nạ bit, nhân các giá trị màu theo các hằng số, vv Vì vậy, tôi nghĩ rằng tôi có thể đạt được hiệu năng bằng cách sử dụng nội tại SSE/SSE2.Xử lý pixel byte với nội dung SSE/SSE2 trong C
Tuy nhiên, tôi gặp sự cố về định dạng dữ liệu. Thư viện webcam của tôi cho tôi khung hình webcam dưới dạng con trỏ (void *) đối với bộ đệm chứa các pixel byte 24 hoặc 32 bit ở định dạng ABGR hoặc BGR. Tôi đã được đúc này để char * để ptr ++ vv cư xử một cách chính xác. Tuy nhiên, tất cả các hoạt động SSE/SSE2 đều mong đợi bốn số nguyên hoặc bốn số float, trong các kiểu dữ liệu __m128 hoặc __m64. Nếu tôi làm điều này (giả sử tôi đã đọc các giá trị màu từ bộ đệm vào ký tự r, g và b):
float pixel [] = {(float) r, (float) g, {float) b, 0,0f};
sau đó tải một mảng phao đầy đủ các hằng số
hằng float [] = {0,299, 0,587, 0,114, 0.0f};
cast cả con trỏ float để __m128, và sử dụng __mm_mul_ps nội tại để làm r * 0,299, g * 0,587 vv vv ... không có đạt được hiệu suất tổng thể bởi vì tất cả những thứ xung quanh shuffling chiếm rất nhiều thời gian!
Có ai có bất kỳ đề xuất nào về cách tôi có thể tải các giá trị pixel byte này một cách nhanh chóng và hiệu quả vào thanh ghi SSE để tôi thực sự có được hiệu suất hoạt động trên chúng không?
Bạn cần phải thực hiện các hoạt động nổi-điểm? Ngoài ra còn có MMX, hoạt động trên các loại số nguyên. –
Thật vậy. Nếu bạn đang làm việc trên các loại số nguyên, bạn nên sử dụng các hướng dẫn SIMD không tách rời, thay vì các chỉ lệnh dấu phẩy động. –
tôi không cần phải làm bất cứ điều gì dấu chấm động, vì vậy bạn nói đúng, hướng dẫn nguyên MMX là hoàn toàn phù hợp. –