fSetArray(int rows, int cols, float val)
{
int i, j;
F2D *out;
out = fMallocHandle(rows, cols);
for(i=0; i<rows; i++)
for(j=0; j<cols; j++)
subsref(out,i,j) = val;
return out;
}
这段代码中最重要的部分是两个循环。基本上,我们有一个二维数组,它有一定的宽度(行)和一定的高度(列),我们将所有值都设置为val。但是我没有看到任何可以消除其中一个循环(这将是加速的最佳方法)的方法,除非我漏看了什么明显的东西。如果cols和rows是相同的数字,那么这会变得容易得多。
另一个函数是:
fDeepCopy(F2D* in)
{
int i, j;
F2D* out;
int rows, cols;
rows = in->height;
cols = in->width;
out = fMallocHandle(rows, cols);
for(i=0; i<rows; i++)
for(j=0; j<cols; j++)
subsref(out,i,j) = subsref(in,i,j);
return out;
}
输出数组始终大于输入数组,因此我们不必担心溢出等问题。这个函数基本上只是交换了两个数组的值,但由于它非常简单,我无法进一步减少它。
在有人提到并行化之前,由于样本大小和服务器,创建线程所需的开销实际上会减慢程序的速度。我已经尝试过了。因为这两个函数太短了,不值得创建线程,只是为了在一个并行循环后杀死它们。
但是作为参考,技术上说这是一个OpenMP项目,我们应该使用并行化,但对于这两个函数来说,这样做实际上会降低整个程序的速度。我已经用并行循环计时过了。
编辑:感谢所有给我提建议的人!现在我已经让它完全运行,并且速度非常快!
subsref
是如何定义的?它很可能是一个宏,但如果它是一个函数,请确保它被内联。或者将其重写为宏。 - Greg Inozemtsev