我正在尝试编写有关传感器计算器的程序,我想听听你们,我们如何才能改善程序的执行时间?
简而言之,传感器计算器是执行矩阵乘法的程序。它每秒可以接收50,000个矩阵。传感器计算器的主要工作是接收矩阵并使用已存储在程序中的5个矩阵之一来计算它们。
传感器计算器有5种方法,每种方法都有自己的矩阵,它与接收(参数)矩阵(矩阵乘法)相乘。当然,他们返回生产的矩阵。
所有矩阵的大小均为10x10。
例如,第一种方法是:
public int[10][10] calculateWind(int[10][10] A){
int[10][10] C = new int[10][10]; //
for (int i = 0; i < 10; i++) { // Row
for (int j = 0; j < 10; j++) { // Column
for (int k = 0; k < 10; k++) { // Column
C[i][j] += A[i][k] * B[k][j];//B is constant matrix(private attribute)
}
}
}
return C;}
我正在使用Java,但有人告诉我,我可以使用FORTRAN&amp; C与Java,这可能会有所帮助?
我正在努力找到最快捷的方式。告诉我们你认为可以帮助我的程序改善它的性能的一切。改变编程语言?使用独特的算法?
除了使用ASSEMBLY之外,欢迎提出任何建议,并感谢您的建议。
答案 0 :(得分:0)
有些库使用比直接的三个嵌套循环更快的算法实现矩阵乘法。
答案 1 :(得分:0)
您应该在分析器中运行该程序以查找热点,并测量您的更改所产生的效果。
可能的改进是重新排序循环以最小化缓存未命中:
for (int i = 0; i < 10; i++) {
for (int k = 0; k < 10; k++) {
for (int j = 0; j < 10; j++) {
C[i][j] += A[i][k] * B[k][j];
}
}
}
对于像你这样小的矩阵,不太可能有显着的改进,因为你的整个数据都适合CPU缓存。
使用C不太可能提高性能。经过几次迭代后,JIT会将代码编译为native,而CPU运行的代码基本上与C编译器生成的代码相同。由于自动矢量化,Fortran可能会更好,但对于这么小的矩阵来说差异可能并不大。