- 主题:用C++和C#测试,lambda的开销还是比较明显
还有, 我在vc中设了 /fp:fast 选项,但是好像效果不明显,您也可以试下。
这个选项对应numba的fastmath=True
【 在 ble 的大作中提到: 】
: 实际上你的C++都在做double加法,没法启用AVX;而Python代码都在做int加法,所以可以启用。
: #include <chrono>
: #include <format>
: ...................
--
FROM 123.112.71.*
这个事, 我觉得可以不在乎,但是大概开销多少不能不知道
【 在 feed 的大作中提到: 】
: 其实编程老考虑这种问题挺悲哀的,都什么时代了
: 抬头一看,原来是这个版,算我没说
:
--
FROM 123.112.71.*
avx512 直接提高了一倍,太牛了
看到网上说,intel 采用大小核之后,就不支持avx512了。
我一直没弄明白,intel的小核除了不支持超线程,是不是也不支持simd指令集?
还是小核支持avx2之下的simd, 只是不支持avx512?
后来intel全面取消avx512,除了能耗, 是不是考虑到大小核支持的指令集不一致,会给调度带来问题?
【 在 haha103 的大作中提到: 】
: 又换了台机器,objdump上传了,有时间的可以看看,哈哈。总的来说就是avx512比较上头,优势有点明显
: 给run0-6前面加了个__attribute__((noinline))方便大家看汇编
:
: ...................
--
FROM 123.112.71.*
嗯, 看了下, 2013年就推出了,是给至强用的。
酷睿有时支持,有时不支持
intel 觉得个人电脑有没有这个无所谓。
【 在 haha103 的大作中提到: 】
: Intel服务器和工作站的CPU一直有AVX512啊
--
FROM 123.112.71.*
今天又折腾了会C#。
先是使用PLINQ的Aggrigate, 需要0.9秒,而没有并行的Aggrigate只要0.6-0.7秒。
Range(0.0,10000_0000).AsParallel().Sum();
虽然写起来非常简单,但是性能非常不理想。LINQ只能用在大执行粒度或者性能不敏感的地方。
然后用并行循环:
public static double run_pfor()
{
ConcurrentBag<double> bag= new ConcurrentBag<double>();
int n = 10000_0000;
Parallel.ForEach(Partitioner.Create(0,n , n/8+1),
(range) => {
double s = 0;
for (int i = range.Item1; i <range.Item2; i++)
s += i;
bag.Add(s);
});
return bag.Sum();
}
自己写并行循环的速度提升很多,从单线程的0.14秒,提升到0.016秒,
接近于c++的0.014秒,基本发挥了多线程的作用。
但是,与python+numba的0.006秒还是差不少。这个差别是dotnet编译器和jit都不会进行simd优化。
只有开发者主动写了simd代码才能使用simd指令。这个很让人失望。
VC++也基本没有发挥simd的作用,不过前面帖子的gcc的simd优化效果很好。
最后的pk,python+numba(llvm、openmp、icc_rt)最快,不过numba编程时不能使用python对象,这是一个很大的限制。
最后,再罗列下C++,C#,Python的耗时:
简单循环:0.14, 0.14, 8秒
加速后:0.014, 0.016, 0.006秒
编程方面,python+numba,c++openmp 都是自动并行化,不需要改变代码逻辑,工作量很小
而c# 缺乏自动并行和向量化,需要手动实现,工作量最大。
【 在 finlab 的大作中提到: 】
: 循环1亿次进行double类型的累加计算:
: double run(int n, function<double(double, double) > f)
: {
: ...................
--
FROM 123.112.71.*
只有在简单的运算上才能更好看出各种语言设施本身的开销
对于耗时较长的复杂运算,设施本身的开销占比下降,反而影响不大。
python最快,是因为numba实现使用了llvm,同时也调用了openmp和intel的SVML,能够充分挖掘算力。
如果是能够向量化的,我相信python还是会明显超过MSC, gcc应该能和python差不多。
你可以换个复杂运算再比较西Python和C++,我电脑上没有gcc
【 在 ziqin 的大作中提到: 】
: python你换个复杂点的数据结构试试看?讲真,你这不是在测并行效率,你这是在测overhead的开销
--
FROM 123.112.71.*
这个分配是一次性的,在循环外部,在这里影响不大。
主要影响还是循环内部的函数调用开销
【 在 ziqin 的大作中提到: 】
: 不是inline不inline的问题,std::function内部有一个动态分配内存的overhead
:
--
FROM 123.112.71.*
如果不用模板, 不用std function, 这个lambda的参数类型怎么写?
这个我还不熟。
【 在 wesleyzeng 的大作中提到: 】
: 将std fuction 替换成真实的lambda试试。这里的慢是std function导致的
: 发自「今日水木 on iPhone 13 Pro Max」
--
FROM 123.112.71.*