Я работаю над частью кода OpencL для специализированной матричной функции: для вектора Dx1
v
, двух матриц DxD
A
и B
и константа c
, возвращаем 1xD
вектор r
, где r [i] = c * sum_over_j ( v [j] * A [i] [j] * B [i] [j])
Ниже показано то, что у меня есть на данный момент, но оно работает чертовски медленно. Версия без суммирования, которая возвращает матрицу DxD
, примерно в десять раз быстрее. Он вызывается из PyOpenCL, если это имеет значение.
Что-то сделано не так? Можно ли его оптимизировать?
#define D 1000
...
__kernel void element_mult(
__global float *result,
__global const float *vector,
__global const float *matrix,
__global const float *matrix2,
const float factor)
{
int y = get_global_id(1);
float sum = 0;
for(int k = 0; k < D; k++)
{
sum += vector[k] * matrix[(y*D) + k]
* matrix2[(y*D) + k ];
}
result[y] = sum * factor;
}
Ура!