【问题标题】:Implementation of row by row matrices operation in OpenCLOpenCL中逐行矩阵运算的实现
【发布时间】:2020-07-17 04:26:10
【问题描述】:

我是OpenCL的新手,学习了一些OpenCL中矩阵运算的基本教程,但我几乎不明白如何将C++中的一些循环运算实现到OpenCL中。

对于二维数组,matrix A x matrix A 的直接乘法将实现为:

__kernel void sum(
    __global const float *a, __global float *g) {
        const int size = 4;
        int i = get_global_id(1);
        int j = get_global_id(0);

        float z  = a_g[i];
        g [i+size*j] = a[i+size*j] *a[i+size*j]  ;
        }

但是如果我只想将某些行中的元素相乘而不是整个矩阵呢?

for (int j=1; j < 4; j++){
    for (int i=0; i < 4; i++){
         P[0][j] += Z[i][0]*Z[i][j];
    }
}

说 P 是一维数组,其中 P 的每个元素是每行第一个元素与矩阵 Z 行中的所有元素相乘的总和。如何处理每行中的第一个元素,如 @ 所示987654324@ 并在 OpenCL 中与Z[i][j] 相乘?

谢谢

【问题讨论】:

    标签: c++ opencl matrix-multiplication


    【解决方案1】:

    首先,您示例中的内核不是计算标准矩阵乘积。它似乎在做一个 Hadamard 产品。但是,直接翻译 CL 中的 for 循环代码可能看起来像这样:

    __kernel void product(__global const float *Z, __global float *P)
    {
            const int size = get_global_size(0);
            int j = get_global_id(0);
            P[j] = 0;
            for (int i = 0; i < size; ++i)
            {
                 P[j] += a[size*i] *a[j + size*i];
            }
    }
    

    全局大小为 {4}。这不是最佳解决方案,但它是最简单的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-29
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      相关资源
      最近更新 更多