s***r 发帖数: 32 | 1 我有一个C# code,几乎是纯计算。要跑很长时间,现在想提高一下效率。
看了下数据结构和算法,似乎没有什么能提高的了
现在想:
1.多线程。机子有多个CPU.可是分成多线程后效率并没有提高特别多(8 core,
用了7-8个线程,速度只提高了一倍,用4线程只提高25%)。
原因大概是context switch太多了
试过改高priority,把线程的affinity设定在一个core上,似乎都没什么用,
不知道是不是因为是C# code,CLR管的太多了
2.用C++写。但是听说纯计算C#比C++不差太多。
请教还有什么办法? |
j*****k 发帖数: 1198 | 2 纯计算如果是大量的话,为什么不用fortran?
【在 s***r 的大作中提到】 : 我有一个C# code,几乎是纯计算。要跑很长时间,现在想提高一下效率。 : 看了下数据结构和算法,似乎没有什么能提高的了 : 现在想: : 1.多线程。机子有多个CPU.可是分成多线程后效率并没有提高特别多(8 core, : 用了7-8个线程,速度只提高了一倍,用4线程只提高25%)。 : 原因大概是context switch太多了 : 试过改高priority,把线程的affinity设定在一个core上,似乎都没什么用, : 不知道是不是因为是C# code,CLR管的太多了 : 2.用C++写。但是听说纯计算C#比C++不差太多。 : 请教还有什么办法?
|
b******n 发帖数: 592 | 3 你可以核心部分用C++。其实优化问题具体很不同,虽然说是纯计算,数据是如何存放的
,数据有什么特点等等。
用C++,然后用SSE2,起码可以提高一倍,跟线程也没什么冲突。很多时候内存是个瓶颈
。
【在 s***r 的大作中提到】 : 我有一个C# code,几乎是纯计算。要跑很长时间,现在想提高一下效率。 : 看了下数据结构和算法,似乎没有什么能提高的了 : 现在想: : 1.多线程。机子有多个CPU.可是分成多线程后效率并没有提高特别多(8 core, : 用了7-8个线程,速度只提高了一倍,用4线程只提高25%)。 : 原因大概是context switch太多了 : 试过改高priority,把线程的affinity设定在一个core上,似乎都没什么用, : 不知道是不是因为是C# code,CLR管的太多了 : 2.用C++写。但是听说纯计算C#比C++不差太多。 : 请教还有什么办法?
|
k****f 发帖数: 3794 | 4 怎么用SSE2??手写汇编码么?
放的
【在 b******n 的大作中提到】 : 你可以核心部分用C++。其实优化问题具体很不同,虽然说是纯计算,数据是如何存放的 : ,数据有什么特点等等。 : 用C++,然后用SSE2,起码可以提高一倍,跟线程也没什么冲突。很多时候内存是个瓶颈 : 。
|
b******n 发帖数: 592 | 5 不用,有函数,具体要看平台。gcc和vc的不一样。google一下。
【在 k****f 的大作中提到】 : 怎么用SSE2??手写汇编码么? : : 放的
|
b******n 发帖数: 592 | 6 也注意一下prefetch,还有数据在内存中的存放方法,对其等等,这些东西在AMD平台非
常重要,Intel好像比较好一些,不用手工优化太多。
【在 b******n 的大作中提到】 : 不用,有函数,具体要看平台。gcc和vc的不一样。google一下。
|
k****f 发帖数: 3794 | 7 那种函数基本也是对应于汇编码的
是不是用了这种函数,那个函数的调用代码中,gcc的优化选项就会被暂时禁止呢?
曾经用vc写过mmx的并行,结果还不如用c语言的优化。
肯定是有什么trick在里面,比如内存对齐,交错指令,预读取,
没有用对的话,结果还不如不用
【在 b******n 的大作中提到】 : 不用,有函数,具体要看平台。gcc和vc的不一样。google一下。
|
b******n 发帖数: 592 | 8 内存对其和预读取是起码的。这个不影响gcc本身的优化。关键是如果你的计算很核心的
地方。没必要什么都优化。你可以先反汇编一下核心计算函数的源代码,4.3支持SSE2,
看看有什么效果。你做的是什么样的计算?
【在 k****f 的大作中提到】 : 那种函数基本也是对应于汇编码的 : 是不是用了这种函数,那个函数的调用代码中,gcc的优化选项就会被暂时禁止呢? : 曾经用vc写过mmx的并行,结果还不如用c语言的优化。 : 肯定是有什么trick在里面,比如内存对齐,交错指令,预读取, : 没有用对的话,结果还不如不用
|
f*******y 发帖数: 988 | 9 算法和数据结构都没啥可能提高的话,不如花钱买台好机器
【在 s***r 的大作中提到】 : 我有一个C# code,几乎是纯计算。要跑很长时间,现在想提高一下效率。 : 看了下数据结构和算法,似乎没有什么能提高的了 : 现在想: : 1.多线程。机子有多个CPU.可是分成多线程后效率并没有提高特别多(8 core, : 用了7-8个线程,速度只提高了一倍,用4线程只提高25%)。 : 原因大概是context switch太多了 : 试过改高priority,把线程的affinity设定在一个core上,似乎都没什么用, : 不知道是不是因为是C# code,CLR管的太多了 : 2.用C++写。但是听说纯计算C#比C++不差太多。 : 请教还有什么办法?
|
b**********y 发帖数: 26 | 10 先写个log看看那部分最费时间。
【在 s***r 的大作中提到】 : 我有一个C# code,几乎是纯计算。要跑很长时间,现在想提高一下效率。 : 看了下数据结构和算法,似乎没有什么能提高的了 : 现在想: : 1.多线程。机子有多个CPU.可是分成多线程后效率并没有提高特别多(8 core, : 用了7-8个线程,速度只提高了一倍,用4线程只提高25%)。 : 原因大概是context switch太多了 : 试过改高priority,把线程的affinity设定在一个core上,似乎都没什么用, : 不知道是不是因为是C# code,CLR管的太多了 : 2.用C++写。但是听说纯计算C#比C++不差太多。 : 请教还有什么办法?
|
|
|
c*****z 发帖数: 1211 | 11 profiling先
【在 b**********y 的大作中提到】 : 先写个log看看那部分最费时间。
|
y*****a 发帖数: 171 | 12 纯计算的话,你得有话算法。C#和java差不多,如果你的程序消耗内存很多,你去看看
,java virtual machine方面的paper, 有很多内存优化的方法,这个和普通的gcc不一
样的,不过低层原理是一致的。 |
a******8 发帖数: 46 | 13 "多线程"运行过程中观察CPU和Memory利用率,看哪个是bottle-neck?
留意一下程序中"lock"的使用, 很多情况都是由资源竞争引起的.
如果方便的话,share一下你的程序,让大家看看. |
j*k 发帖数: 109 | 14 我的C#程序速度是C++的一半,纯计算。VS默认的RELEASE编译。 |
y*****g 发帖数: 2 | 15 试一试关键的数据结构用Struct? 个人经验纯计算很大的开销在堆分配上
【在 j*k 的大作中提到】 : 我的C#程序速度是C++的一半,纯计算。VS默认的RELEASE编译。
|
c****e 发帖数: 1453 | 16 prejit your program first. |