OpenCL中逐行矩阵运算的实现
Implementation of row by row matrices operation in OpenCL
我是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]
?
谢谢
首先,您示例中的内核并未计算标准矩阵乘积。它似乎在做 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}。这不是最佳解决方案,但它是最简单的。
我是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]
?
谢谢
首先,您示例中的内核并未计算标准矩阵乘积。它似乎在做 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}。这不是最佳解决方案,但它是最简单的。