Индексирование векторов в SIMD

Я работаю с SIMD и пытаюсь векторизовать цикл. Здесь я пытаюсь добавить вектор индексов к указателю слева, чтобы получить значение указателя в этом индексе, а затем продолжить выполнение операций SIMD.

Например, если бы я делал это без SIMD, это выглядело бы так:

x1 = left[a]

x2 = left[b]

x3 = left[c]

x4 = left[d]

где [a, b, c, d] хранится в векторе индексов (index_left_float)

float* left_Array[] = {left, left, left, left};

__m128 left_Array_simd = _mm_load_ps((float *) left_Array);

__m128 nleft = _mm_add_ps(index_left_float, left_Array_simd);

Я также попытался загрузить nleft в новый вектор, чтобы получить значения, хранящиеся внутри указателя, оставленного в индексах nleft, но это не позволило мне.

Единственное, что я могу придумать, - это извлечь индексы из вектора, выполнить этот расчет как обычно, а затем перезагрузить его в вектор, но это кажется очень дорогостоящим, и я пытаюсь максимально оптимизировать свой код. Любой совет приветствуется! Я обнаружил, что сайты SIMD / SSE очень трудны для понимания. Спасибо!


person Meow    schedule 18.11.2014    source источник
comment
Похоже, вы пытаетесь выполнить собранную нагрузку, то есть не поддерживается в SSE, но поддерживается в AVX2. Однако это очень неэффективно и обычно является признаком того, что вы приближаетесь к векторизации с неправильного угла (или что вашу проблему по своей природе сложно / невозможно векторизовать). Попробуйте опубликовать весь скалярный цикл и посмотрите, сможет ли кто-нибудь придумать альтернативную стратегию векторизации.   -  person Paul R    schedule 18.11.2014
comment
Инструкции SIMD чувствуют себя комфортно с данными, хранящимися по смежным адресам, что объясняет, почему косвенная адресация не поддерживается (не поддерживалась, см. Комментарий @ PaulR). Подумайте о том, как диспетчер памяти должен собирать данные одновременно с нескольких независимых адресов ...   -  person Yves Daoust    schedule 18.11.2014
comment
См. Также: stackoverflow.com/questions/19557746/, stackoverflow.com/questions/23850431/ и др.   -  person Paul R    schedule 18.11.2014