c++ - OpenCL中逐行矩阵运算的实现

标签 c++ opencl matrix-multiplication

我是 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 行中所有元素的乘积之和。如何寻址每行中由 Z[i][0] 表示的第一个元素并在 OpenCL 中与 Z[i][j] 相乘?

谢谢

最佳答案

首先,您示例中的内核没有计算标准矩阵乘积。它似乎正在做哈达玛产品。然而,在 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}。这不是最佳解决方案,但它是最简单的。

关于c++ - OpenCL中逐行矩阵运算的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62947107/

相关文章:

c++ - 在 Visual Studio Express 2012 中包含路径

c++ - 计算也是平方数的第 N 个三角数

python - 使用 Python Pandas 数据框进行乘法

performance - 矩阵乘法有多昂贵?

c++ - 如何在 Qt LineEdit 上使用 .hide,仍然接受输入?

c++ - C 转换失败 : cannot cast from void* to a C struct

c++ - 在嵌套 Lambda 中捕获 Lambda 的静态

c - 普通的指针算术可以在 opencl 内核上工作吗?

matlab - openCL中CPU和GPU处理数据的区别

opencl - 内置函数 isequal、isnotequal、isgreater 等有什么意义?