Ускорить умножение двух массивов для свертки

У меня есть приложение, и я выполнил профилирование скорости своего кода, и ограничивающим фактором является умножение двух массивов. У меня есть один массив X следующим образом (в моем реальном коде это 2000 элементов, а не 15):

a b c d e f g h i j k l m n o

и второй массив Y (в моем реальном коде это 300 элементов, а не 6) следующим образом:

A B C D E F

Затем я умножаю массивы следующим образом, чтобы создать новый массив C:

value 1  A*a+B*b+C*c+D*d+E*e+F*f
value 2  A*b+B*c+C*d+D*e+E*f+F*g
value 3  A*c+B*d+C*e+D*f+E*g+F*h
value 4  A*d+B*e+C*f+D*g+E*h+F*i
value 5  A*e+B*f+C*g+D*h+E*i+F*j
value 6  A*f+B*g+C*h+D*i+E*j+F*k
value 7  A*g+B*h+C*i+D*j+E*k+F*l
value 8  A*h+B*i+C*j+D*k+E*l+F*m
value 9  A*i+B*j+C*k+D*l+E*m+F*n
value 10 A*j+B*k+C*l+D*m+E*n+F*o

Мне было интересно, есть ли способ ускорить этот код. В настоящее время я просто использую код:

for (int l=0; l<X.length; l++) {
    val=0;
    for (int i=0; i<X.length; i++)
        for (int j=0; j<J.length; j++)
            val+=X[i]*Y[j];
    C[l]=val;
}

Хотя я мог бы использовать преобразования Фурье, но это медленнее, чем умножение.


person skinhat    schedule 07.11.2013    source источник
comment
Этот внутренний цикл не подходит для свертки. Разве вам не нужно что-то вроде val+=X[i+l]*Y[j] с другим условием выхода, чтобы предотвратить доступ к X за пределами границ?   -  person Jim Lewis    schedule 08.11.2013


Ответы (1)


Я бы рекомендовал использовать реализацию BLAS, которая де-факто является стандартной научной библиотекой для выполнения основных векторных/матричных операций. Вероятно, существует высокооптимизированная версия BLAS, доступная для выбранной вами архитектуры, использующая SIMD-инструкции (если они есть) и заботящаяся о насыщении конвейера для достижения максимальной пропускной способности. Например: OS X и iOS поставляются с реализацией BLAS в Accelerate.framework.

(Также обратите внимание, что ваш код не выполняет свертку. val зависит только от i и j, поэтому каждый элемент C будет таким же: сумма произведений каждой пары из X и J. )

person Tamás Zahola    schedule 07.11.2013
comment
Хорошо, спасибо. Я надеялся, что будет трюк, который я мог бы использовать, чтобы ускорить его. Я использую его на Android и обнаружил, что рендерскрипт самый быстрый, поэтому, вероятно, не буду использовать BLAS. - person skinhat; 08.11.2013