1
5
两种想法:
如果你能解释更多关于你试图解决的系统是什么样子的,我可能会给出更多关于3和4的建议。 |
2
5
我想我已经设法优化了它,这里有一个代码,用VC++创建一个新项目,添加这个代码,然后在“release”下简单地编译。
像这样运行: app.exe 10000欧 app.exe 10000 N “O”代表旧代码,你的。 “N”是我的,新的。 我的结果: 速度(原始): 1515028年 1523171个 1495988年 速度(新): 九十六万六千零一十二 九十八万四千一百一十 1006045个 提高了30%左右。 背后的逻辑: 您一直在使用索引计数器进行访问/操作。 我用指针。 运行时,在VC++的调试器中的某个计算代码行处断点,然后按F8。你会看到分解器窗口。 您将看到生成的操作码(汇编代码)。 不管怎样,看: int*x=…; X[3]=123; 这告诉PC将指针x放在寄存器(比如eax)上。 加上它(3*sizeof(int))。 只有这样,才能将该值设置为123。 正如您所理解的,指针方法要好得多,因为我们减少了添加过程,实际上我们自己处理它,从而能够根据需要进行优化。 我希望这有帮助。 stackoverflow.com员工的旁注: 很好的网站,希望我早就听说了! |
3
3
首先,这里似乎有一个管道问题。循环从中的值读取
它是 Eamon Nerbonne 谁知道的。很多人都支持他!我永远也猜不到。 |
4
2
波尼的回答对我来说是正确的。
我只是想指出,在这类问题中,你
经常
从记忆位置中获益。现在,
例如,1280x1280的解决方案略小于2x 更快 比Poni的解决方案(在我的测试中是13秒对23秒——最初的实现是22秒),而在128x128时是30% 更慢的 (7秒对10秒——你的原稿是10秒)。 (基本情况下迭代扩展到80000次,而更大的1280x1280次则扩展到800次。) |
5
1
我认为你认为记忆成为瓶颈是对的。这是一个非常简单的循环,每次迭代只需要一些简单的算术运算。IC、IW、IE、IS和IN索引似乎位于矩阵的另一边,所以我猜想这里有一堆缓存未命中。 |
6
1
我不是这个问题的专家,但我已经看到了 there are several academic papers 提高高斯-赛德尔方法的缓存使用率。 另一种可能的优化方法是使用红黑变种,在这种变种中,点以棋盘状的模式在两次扫描中更新。这样,扫描中的所有更新都是独立的,并且可以并行化。 |
7
0
我建议输入一些预取语句,并研究“面向数据的设计”:
这与第二种方法不同,因为在执行计算之前,值被复制到局部临时变量。 |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
rainer · 后台插入程序的初始化 1 年前 |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |