Как преобразовать тип данных c в неоновый тип данных

Я учусь оптимизировать код используя ARM неоновые инструкции.У меня есть функция C ++, которая выполняет определенную операцию. Скажем, например,

int* multiplyCorrespondingElements(int* arr1, int* arr2)

arr1 и arr2 — это два целочисленных массива одинакового размера n (n> 50). Эта функция должна умножить соответствующие элементы данных массивов.

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

int8x8_t or int16x4_t or int32x2_t or int64x1_t.

и функция, которую мне нужно использовать для умножения, является одной из функций, данных в

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0491c/CIHJBEFE.html

Как я могу преобразовать int [], который доступен в качестве параметра функции, в векторные типы данных arm neon? Каковы критерии для определения, какой вектор мне следует использовать и какую функцию умножения я должен использовать?

Я много искал, но не смог найти подобного примера. Все примеры, доступные в сети, принимают в качестве параметра сам векторный тип данных. Я не могу этого сделать, так как функция должна быть частью большей библиотеки C ++, и я могу изменить эту функцию только для оптимизации производительности.

Есть ли учебник для начинающих, использующих руку неон? Может кто-нибудь привести простой пример. Благодарю.

2

Решение

Как правило, вы используете vld intrinsics для загрузки вектора элементов из каждого входного массива, например,

for (i = 0; i < n; i += 4)               // iterate through arrays, 4 elements at a time
{
int4x32_t v1 = vld1q_s32(&arr1[i]);  // load vector of 4 x 32 bit ints from arr1
int4x32_t v2 = vld1q_s32(&arr2[i]);  // load vector of 4 x 32 bit ints from arr2
int4x32_t vp = vmulq_s32(v1, v2);    // multiply vectors
// ... do other stuff ...
// ... store results  ...
}
2

Другие решения


По вопросам рекламы [email protected]