比方說,例如,我有2個變量__m256i
叫rows
和cols
,在他們裏面的值是:現在從`__m256i`使用值來訪問有效的陣列 - SIMD
rows: 0, 2, 7, 5, 7, 2, 3, 0
cols: 1, 2, 7, 5, 7, 2, 2, 6
,這些值表示爲8個點的x
和y
位置,從而,在這種情況下,我將有以下幾點:
p0: [0, 1], p1: [2, 2], p2: [7, 7], p3: [5, 5]
p4: [7, 7], p5: [2, 2], p6: [3, 2], p7: [0, 6]
我也有一個陣列稱爲lut
將具有的值int
類型:
lut: [0, 1, 2, 3, ..., 60, 61, 62, 63]
我想要做的,是從rows
和cols
變量使用這些位置值,用它訪問lut
陣列並創建一個新__m256i
值與lut
訪問值。
我知道該怎麼做,這將是存儲rows
和cols
值大小爲8兩個int
陣列,然後在同一時間從lut
陣列一個讀出的值,然後使用_mm256_set_epi32()
創建新_m256i
價值的方式。
這有效,但在我看來是非常低效的..所以我的問題是如果有辦法做得更快。
請注意,這些值僅僅是一個更具體的例子,並lut
並不需要有有序值或大小64
的感謝!
查找表通常在現代處理器上效率不高,因爲它們總是創建數據依賴關係,所以如果您可以找到一種方法來用某種算術公式替換查找表,即使它有點複雜,它可以更快。否則,請參閱chtz的答案。 –
向我們顯示您的代碼。比它可能給你一個優化提示。 – xMRi
有時你可以將你的索引切分成4位的塊,並用'pshufb'來獲得一個16元的LUT。 (例如看看http://wm.ite.pl/articles/sse-popcount.html的SSE/AVX popcount實現。)但是當你的索引不是「可分離的」時,你必須用低字節進行多次混洗,並混合高字節,所以這是O(2 ^(n-4))適用於n位有效位,其中n> = 4。 –