稀疏矩阵的矩阵乘法速度是否比密集矩阵快?
Is matrix multiplication speed faster for sparse matrixes than dense matrixes?
稀疏矩阵的矩阵乘法速度是否比稠密矩阵快?
举个简单的例子,
做
“[[0,0],[0,0]] 乘以 [[1,1],[1,1]]”
比...快
“[[256,256],[256,256]] 乘以 [[1,1],[1,1]]” ?
执行乘法的机器码算法是这样的:
int mul(int a,int b)
{
int result = 0;
bit sign = sign(a) ^ sign(b);
a = abs(a); b = abs(b);
while (b != 0)
{
b = b>>1; // shift b right, bit0 into carry
if (carrySet()) result += a;
a = a<<1; // shift a left
// note: checks for overflow being left out
}
return (sign==0 ? sum : -sum);
}
您会很容易地看到,在右操作数中设置的位数越多,对左操作数求和所需的计算就越多。
因此,如果您的矩阵乘法归结为像这样的机器代码乘法,稀疏矩阵的乘法将比密集矩阵快得多。
我在这里无法回答的问题是 FPU
是否会以更有效的方式执行此操作。你会想在这里阅读一些规格。但即使 FPU(或 GPU)正在做某种调整,我怀疑基本的乘法研磨循环看起来有很大不同(对此评论感兴趣。)
稀疏矩阵的矩阵乘法速度是否比稠密矩阵快? 举个简单的例子, 做 “[[0,0],[0,0]] 乘以 [[1,1],[1,1]]” 比...快 “[[256,256],[256,256]] 乘以 [[1,1],[1,1]]” ?
执行乘法的机器码算法是这样的:
int mul(int a,int b)
{
int result = 0;
bit sign = sign(a) ^ sign(b);
a = abs(a); b = abs(b);
while (b != 0)
{
b = b>>1; // shift b right, bit0 into carry
if (carrySet()) result += a;
a = a<<1; // shift a left
// note: checks for overflow being left out
}
return (sign==0 ? sum : -sum);
}
您会很容易地看到,在右操作数中设置的位数越多,对左操作数求和所需的计算就越多。 因此,如果您的矩阵乘法归结为像这样的机器代码乘法,稀疏矩阵的乘法将比密集矩阵快得多。
我在这里无法回答的问题是 FPU
是否会以更有效的方式执行此操作。你会想在这里阅读一些规格。但即使 FPU(或 GPU)正在做某种调整,我怀疑基本的乘法研磨循环看起来有很大不同(对此评论感兴趣。)