2012-05-14 13 views
10

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.

+0

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

+2

@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

Trả lời

12

Nếu bạn có thể đợi đến năm sau, CPU Haswell của Intel sẽ có AVX2 bao gồm hướng dẫn cho các tải được thu thập. Điều này cho phép bạn thực hiện ví dụ: 8 tra cứu LUT song song trong một hướng dẫn (xem ví dụ: VGATHERDPS). Ngoài ra, bạn không may mắn, trừ khi LUT của bạn khá nhỏ (ví dụ: 16 phần tử), trong trường hợp này bạn có thể sử dụng PSHUFB.

+0

Thật không may LUT của tôi là 10000 phần tử lớn. Ngay cả khi tôi phải chờ một bộ vi xử lý mới, nó sẽ là năm cho đến khi nó sẽ là hợp pháp để xác định Haswell như một cpu tối thiểu. :) Cảm ơn bạn về thông tin. – Rotem

+1

OK - nếu bạn có thể ước tính LUT của mình, ví dụ: với một đa thức thì bạn vẫn có thể giành chiến thắng với SSE, nếu không tôi sợ bạn bị mắc kẹt với mã vô hướng. –

+3

Mã vô hướng là lúc đó. Đây là tin tốt trong một cách, tôi có thể ngừng lo lắng về phần này và đi làm việc trên các bộ phận mà có thể chứng minh tối ưu hơn. – Rotem