(定点工具箱)如何加快fi对象矩阵乘法?

10视图(30天)
以我目前的项目中我需要矩阵乘法与fi对象条目很多。结果表明,这种类型的乘法相比明显慢于MATLAB矩阵乘法双条目。作为一个例子,考虑下面的代码片段:
抽搐;
N = 200;
= fi(兰德(N, N), 1, 32岁,16);
B = fi(兰德(N, N), 1, 32岁,16);
C = A * B;
t = toc;
这大约需要13秒两个200 x200型矩阵相乘。分析代码显示,几乎所有的时间都花在第25行mtimes。定点工具箱的m文件。这条线是:
c = fimtimes (a, b);
调试器不允许我进入fimtimes例程。有可能加速这些类型的计算通过使用墨西哥人文件或其他方法?或者是我唯一向前写我自己的转换函数,模拟定点算术与MATLAB的原生浮点支持吗?万博1manbetx谢谢。这是检查R2017b和R2016a。

答案(2)

约翰D 'Errico
约翰D 'Errico 2018年8月30日
编辑:约翰D 'Errico 2018年8月30日
为什么你会一点点惊讶,代码运行速度低于一个高度优化的代码在双打吗?一个矩阵乘法在双或单精度可以使用布拉斯特区工作,高度优化的例程,可以使用多个线程自己根据需要做这项工作。倍数和添加必要的在低水平称之为苍蝇像大火。
但当你试着这样做与fi对象?fi矩阵乘以肯定是使用简单的循环,而不是在数据类型没有增加或者添加硬件。所以它是慢得一塌糊涂,至少相对。记住,200年x200型矩阵*矩阵相乘涉及200 ^ 3 = 8000000倍数,和一个类似数量的增加。
8 e6/13
ans =
615384.615384615
所以约0.6 megafilops每秒(定点操作)。这在我看来相当快。
你能在MATLAB写自己,或者写c代码?
是的,对的。你可能是在做梦。别忘了在定点运算工作,你需要做一个乘法,然后确保你仔细和正确的结果。
非常小心,因为浮点数不能代表很多像双2.37一样。如果你想做这个任务,你会发现你的计算将会不一致,与fi倍数和阿瑞斯回来了。
所以,你能做到吗?很多,取决于你的编码技巧有多好。他们是足够好,你可以编写代码,相当大的程度上胜过代码写的人知道他们在做什么吗?是你的理解计算机算术足够好,你可以做你自己,高度优化的代码编写比已经存在什么?我猜如果你需要问这个问题,那么它可能不是。
看看,如果200 x200型矩阵*矩阵乘法需要8 e6繁殖,和大约8 e6补充道,目前以13秒做这项工作,那么你需要做一个乘法和加法(失败)明显小于1 e-6秒。
13/8e6
ans =
1.625 e-06
不要忘记函数调用开销,传递数据,等。所以除非手写代码可以准确、有效地打败,速度,那么你会浪费你的时间。
就直接从MATLAB代码编译成墨西哥人,不要期望这将更快。很少提供了一个获得速度,可能会慢一些。
你能写代码,使用并行计算来做这个工作?好吧,如果你有一个并行计算结核许可证,你有足够的能力来做这项工作,你有足够的cpu可以做这项工作,也许。我会先看看fi工具箱矩阵相乘是多线程时调用。有时这些事情已经在使用多个线程自动。
这是非常简单的,迅速制定一个您想要运行的问题。我们被电脑这么快和强大。

安迪·巴特利特
安迪·巴特利特 2020年9月1日
使模拟两个数量级与fiaccel更快
如果定点代码模拟代码生成兼容,那么你可以加速仿真使用
例如,两个附加文件中的代码的修改版本 Starscream123 原来的问题了,
和测试工具。
运行测试工具输出以下我电脑上的计时结果。
> > test_fiMatMul
time_Elapsed_Interpreted_Mode_Sim =
18.2188
time_Elapsed_fiaccel_Mode_Sim =
0.1301
timeReductionPercent =
99.2858
speedUpRatio =
140.0134
注意,模拟使用fiaccel 140 x倍使用解释模式。
特定的运行时间和加快比率将取决于所使用的算法和计算机(s)。

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!