Tôi có chức năng xử lý pixel lớn mà hiện tại tôi đang cố gắng tối ưu hóa bằng cách sử dụng các chức năng nội tại.Bảng tra cứu sử dụng SIMD
Là người mới làm quen với SSE, tôi không chắc chắn cách giải quyết một phần của mã liên quan đến bảng tra cứu.
Về cơ bản, tôi đang cố gắng để vectorize vani C++ mã sau:
//outside loop
const float LUT_RATIO = 1000.0F;
//in loop
float v = ... //input value
v = myLookupTable[static_cast<int>(v * LUT_RATIO)];
Những gì tôi đang cố gắng:
//outside loop
const __m128 LUT_RATIO = _mm_set1_ps(1000.0F);
//in loop
__m128 v = _mm_set_ps(v1, v2, v3, v4); //input values
__m128i vI = _mm_cvtps_epi32(_mm_mul_ps(v, LUT_RATIO)); //multiply and convert to integers
v = ??? // how to get vI indices of myLookupTable?
chỉnh sửa: ildjarn làm cho một điểm mà đòi làm rõ về một phần của tôi. Tôi không cố gắng để tăng tốc cho mã bảng tra cứu, tôi chỉ đơn giản là cố gắng tránh phải lưu trữ các thanh ghi trở lại để nổi đặc biệt để thực hiện tra cứu, vì phần này được kẹp giữa 2 phần khác mà về mặt lý thuyết có thể được hưởng lợi từ SSE.
Ai đã thuyết phục rằng bạn có thể cải thiện trên 'myLookupTable [static_cast (v) * LUT_RATIO]'? Không có tính toán được thực hiện ở đây, tại sao SSE sẽ được áp dụng? –
ildjarn
@ildjarn Tôi khá chắc chắn rằng tôi không thể cải thiện phần này, nhưng tôi hy vọng sẽ cải thiện các phần khác của hàm, và tránh hình phạt di chuyển qua lại giữa '__m128' và' float [4] ' Tôi cũng phải vector hóa mã này. – Rotem