Оценка выражений, состоящих из поэлементных матричных операций в Thrust
Я хотел бы использовать Thrust для оценки выражений, состоящих из поэлементных матричных операций. Чтобы было понятно, рассмотрим выражение вроде:
D=A*B+3*sin(C)
где A
, B
, C
а также D
Матрицы, конечно же, одного размера.
Краткое руководство по тяге содержит saxpy
пример для которого y
используется как для ввода, так и для вывода, в то время как в моем случае выходной аргумент отличается от входных, которые, кстати, больше двух. При поэлементном умножении вектора на CUDA рассматривается случай выходных данных, отличных от входных, но только из двух входных данных.
Может ли кто-нибудь дать некоторые предложения (и, возможно, обоснование) о том, как использовать Thrust для реализации вышеприведенного выражения (выходная матрица отличается от входных и более двух входных данных)? Благодарю.
1 ответ
Вот как реализовать это вычисление с помощью Newton, библиотеки, упомянутой в комментарии talonmies:
#include <newton/newton.hpp>
int main()
{
float a[4] = {1.0, 1.0, 1.0, 1.0};
float b[4] = {2.0, 2.0, 2.0, 2.0};
float c[4] = {3.0, 3.0, 3.0, 3.0};
float d[4] = {4.0, 4.0, 4.0, 4.0};
newton::numeric_vector<float> A = a;
newton::numeric_vector<float> B = b;
newton::numeric_vector<float> C = c;
newton::numeric_vector<float> D = d;
D = A * B + 3.f * sin(C);
return 0;
}
Библиотека построена с использованием thrust::zip_iterator
а также thrust::transform_iterator
реализовать выражения с произвольным количеством входов. Вы можете обратиться к реализации для деталей.