我有一个使用以下内核的2D矩阵乘法程序:
__global__ void multKernel(int *a, int *b, int *c, int N)
{
int column = threadIdx.x + blockDim.x * blockIdx.x;
int row = threadIdx.y + blockDim.y * blockIdx.y;
int index = row * N + column;
if(column < N && row < N)
{
c[index] = a[index] * b[index];
}
}
现在,我想创建一个3D矩阵乘法内核,但是我很难找到如何创建一个的例子(同样,我在阅读数学公式时很糟糕,这是我需要改进的东西)
我知道GPU示例将涉及使用
threadIdx.z
等等,但我对如何去做有点迷失。
有人能指出我正确的方向,或者某些公式或示例代码?甚至提供一个基本的例子?我想有一个应该工作的CPU示例。
void matrixMult3D(int *a, int *b, int *c, int *z, int N)
{
int index;
for(int column = 0; column < N; column++)
{
for(int row = 0; row < N; row++)
{
for (int z = 0; z < N; z++)
{
index = row * N + column + z;
c[index] = a[index] * b[index] * z[index];
}
}
}
}
我至少在正确的轨道上?
答案 0 :(得分:3)
因为你实际所做的只是一个元素方面的产品(我不愿称之为Hadamard Product,因为没有为超矩阵AFAIK定义),你不需要做任何不同的事情。最简单的内核代码1D版本。像这样:
template<int ndim>
__global__ void multKernel(int *a, int *b, int *c, int *z, int N)
{
int idx = threadIdx.x + blockDim.x * blockIdx.x;
int stride = blockDim.x * gridDim.x;
int idxmax = 1;
#pragma unroll
for(int i=0; i < ndim; i++) {
idxmax *= N;
}
for(; idx < idxmax; idx+=stride) {
c[index] = a[index] * b[index] * z[index];
}
}
[免责声明:用浏览器编写的代码,从未编译或运行。自担风险使用]
适用于尺寸为N(ndim = 1),N * N(ndim = 2),N * N * N(ndim = 3)等的任何数组维数。