Можно ли оптимизировать этот код OpenCL?

Я работаю над частью кода 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;
      }

Ура!

5
задан talonmies 23 February 2012 в 13:39
поделиться