- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直试图编写的简单程序的想法是从用户那里获取输入以查看要乘以多大的矩阵。
我希望将输入 x 乘以 x,我目前不希望将两种不同的大小相乘。
你们建议我如何完成这项工作?
对不起,我的问题不够清楚,我想修改这个内核,以便它可以处理任何大小的矩阵(其中 x 和 y 是等价的,以保持简单)。而不是 16 的倍数。
我不确定您是否需要我当前的代码,但这是内核代码:
// CUDA Kernel
__global__ void matrixMul( float* C, float* A, float* B, int wA, int wB,size_t block_size)
{
int bx = blockIdx.x;
int by = blockIdx.y;
int tx = threadIdx.x;
int ty = threadIdx.y;
int aBegin = wA * block_size * by;
int aEnd = aBegin + wA - 1;
int aStep = block_size;
int bBegin = block_size * bx;
int bStep = block_size * wB;
float Csub=0;
for (int a = aBegin, b = bBegin; a <= aEnd; a += aStep, b += bStep)
{
extern __shared__ float As[];
extern __shared__ float Bs[];
extern __shared__ float smem[];
smem[ty*block_size+tx] = A[a + wA * ty + tx];
smem[block_size*block_size+ty*block_size+tx] = B[b + wB * ty + tx];
__syncthreads();
for (int k = 0; k < block_size; ++k)
Csub += smem[ty*block_size+k] * smem[block_size*block_size+k*block_size+tx] ;
__syncthreads();
}
int c = wB * block_size * by + block_size * bx;
C[c + wB * ty + tx] = Csub;
}
更新:我决定使用零填充。但是我得到不正确的答案。取矩阵 A 2x2,填充到 16x16:
5.000 0.000 9.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
矩阵 B,2x2 填充到 16x16:
7.000 4.000 8.000 7.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
所以我得到的 C 的结果是正确的:
35.000 20.000 40.000 35.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
然而,如果你去掉零,矩阵应该是:答:
5.000 0.000
9.000 0.000
乙:
7.000 4.000
8.000 7.000
C 应该是:
35.000 20.000
63.000 36.000
然而,这两个矩阵 C 并不相同。
最佳答案
这不是一个非常明确的问题,因此这个答案是基于您之前在几个相当相似的问题中提出的问题的猜测。
要理解如何进行此类运算,一个很好的起点是回到起点,从第一性原理考虑矩阵-矩阵乘法问题。您对计算两个矩阵 C = AB 的点积的代码感兴趣。您的限制是您使用的内核只能计算矩阵的乘积,这些矩阵是某个内部 block 大小的整数倍。那你能做什么?
看待这个问题的一种方法是想象A 和B 矩阵是block matrices .矩阵乘法可以这样写:
然后可以通过 A 和 B 中的八个子矩阵的乘积组合形成生成的矩阵 C:
这对解决问题的帮助可能不是很明显,但让我们考虑一个具体的例子:
这些第一个事实意味着您的内核只能正确解决 1024x1024 产品或 992x992 产品,但不能解决您需要的 1000x1000 操作。
如果你决定使用 1024x1024 的产品,你可以使用 block 分解的思想来制定这样的问题:
其中 Onn 表示适当大小的零矩阵。现在您有一对 1024x1024
矩阵,它们的乘积将导致
即。左手边,上面的 block 是一个包含 AB 的 1000x1000 矩阵。这实际上是零填充以实现正确的结果。在此示例中,这意味着执行的计算比所需的多大约 7%。重要与否可能取决于具体应用。
第二种方法是使用基本内核计算一个 992x992 产品,然后制定一个策略来处理 block 分解版本计算中的其他七个产品,如下所示:
A11 和 B11 是 992x992 矩阵,O nn 和以前一样是零矩阵。乍一看,这看起来不是很有帮助,但值得记住的是,所有 使右侧矩阵的计算仅包含计算矩阵乘积所需的总计算的大约 1.2%。它们可以在 GPU 进行主要计算时在主机 CPU 上轻松完成,然后添加到 GPU 结果以形成最终矩阵。因为 CUDA API 是异步的,所以大部分主机计算都可以完全隐藏并且实际上是免费的。
此答案包含两种策略,可以只更改当前内核代码的一行 来完成您的要求。显然还有第三种方法,即更彻底地修改内核本身,但这是您应该首先自己尝试的方法,如果您的解决方案不起作用,则寻求帮助。
关于matrix - 使用 CUDA 进行动态矩阵乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9250897/
问题来自 Julia Discourse 我正在使用 Julia 1.2。这是我的测试: a = rand(1000, 1000) b = adjoint(a) c = copy(b) @btime
给定两个 m x n 矩阵 A 和 B,其元素属于集合 S。 问题:A 的行和列可以置换为 B 吗? 解决这个问题的算法的复杂度是多少? 行列式有部分帮助(当 m=n 时):必要条件是 det(A)
这是共同计算平移和旋转的正确方法,还是有更好的方法?目前我的代码先翻译然后旋转,这会造成问题吗? 代码 from math import cos, sin, radians def trig(angl
如何在 core.matrix 中将矩阵和向量元素相乘? 我正在尝试找到与以下 Octave 音程代码等效的 core.matrix: A = [1 2 3 4; 5 6 7 8] B = [2; 3
我是 Scilab 的新用户(另见 here)。 我定义了一个简单的分段函数,并在使用该函数 ( "Warning adding a matrix with the empty matrix will
我有一个像这样的 RDD: (A,AA,1) (A,BB,0) (A,CC,0) (B,AA,2) (B,BB,1) (B,CC,4) 我想将其转换为以下 RRD: ([1,0,0],[2,1,4])
我使用的矩阵如下 (require '[clojure.core.matrix :as ccm]) (def M (ccm/matrix [[1 2] [3 4]])) (ccm/mset! M 0
我有一个矩阵类,它有一组函数,其中一个是矩阵运算符++(); 构造函数: Matrix(int num_rows,int num_col,int initialization,double initi
我有一个矩阵如下; 1 2 3 4 5 1 0 1 1 0 0 2 0 0 1 1 0 3 1 0 0 0 1 4 0 0 1 0 0
我已经部署了为家庭服务器(synapse)运行的单个实例,并附加了多个域作为 example.com 和 example1.com。我想创建像 [email protected] 这样的用户和 [em
我有 200 个向量;每一个的长度都是 10000。 我想填充一个矩阵,使每一行代表一个向量。 最佳答案 如果你的向量已经存储在一个数组中,那么你可以在这里使用 vcat( ): A = [rand(
如何向现有矩阵添加行或列?我正在尝试添加一个偏差项(一列)作为矩阵的第一行。在 Octave 中我可以这样做: M = [ones(size(M, 1), 1), M]; 最佳答案 您可以使用 joi
我正在使用 GNU GSL 进行一些矩阵计算。我正在尝试将矩阵 B 与矩阵 A 的逆矩阵相乘。 现在我注意到 GSL 的 BLAS 部分有一个函数可以做到这一点,但前提是 A 是三角形。这有什么具体原
我想计算如下:Matrix * Matrix Matrix有大约 6M*3 个元素,如何转换 Matrix至 Matrix这样我就能得到 Matrix结果。 最佳答案 您可以使用 Map 函数将 do
我只是没有看到我的错误。关于此错误消息的问题太多了,答案要么不适用,要么我只是看不到它们适用。也许应该改进错误消息? Matrix a = Matrix(3, 4); // fill a with v
在android.opengl.Matrix类中有两种旋转矩阵的方法,它们是: static void rotateM (float[] m, int mOffset, float a, float
我正在使用 C++ 进行编码,并且使用的是 FEniCS fenics/2016.1.0。我的部分代码是 Matrix A; Vector f; std::vector> dirichlet_matr
JAMA(用于矩阵计算的 java 库)中的 JAMA:Matrix.times() 与 Matrix.arrayTimes() 有什么区别 如果我有一个d维度 vector x和一个k维度 vect
我试图做的是简单地将 cublasDgemm(矩阵-矩阵乘法)应用于多个具有“双”(8 字节)类型元素的矩阵,所有这些元素都具有一个非常大的维度。在我的例子中,矩阵的大小是 12755046 x 46
我正在尝试使用 android Matrix 对象旋转给定的位图。 我想将它发送到我的服务器,我正在使用 Android API8。 我应该使用 Matrix.setRotate 还是 Matrix.
我是一名优秀的程序员,十分优秀!