精华帖 (12) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-05-15
最后修改:2009-05-15
ShiningRay 写道 37signals憋不住了啊
受够rails的苦了吧 你没仔细看,这段东西之前是用 C 写的。 说明作者不喜欢语法像 C 的命令式语言,喜欢没括号没分号的函数式语言。 |
|
返回顶楼 | |
发表时间:2009-05-15
Concurrency 是一个trival问题.Parallelism是No-trival的问题,不存在一个可以屏蔽掉所有细节的platform或者API集.换一句话说Parallelism很大程度上不是一个工程问题,更多的是算法问题甚至是数学问题.举个最简单的例子,如何并行计算Fabbonic数列?
|
|
返回顶楼 | |
发表时间:2009-05-15
最后修改:2009-05-15
Trustno1 写道 Concurrency 是一个trival问题.Parallelism是No-trival的问题,不存在一个可以屏蔽掉所有细节的platform或者API集.换一句话说Parallelism很大程度上不是一个工程问题,更多的是算法问题甚至是数学问题.举个最简单的例子,如何并行计算Fabbonic数列?
Axum很简单啊 node1=[(1+√5)/2]^n node2=[(1-√5)/2]^n node3=(√5)*{node1-node2 } Axum代码 n -<< {node1,node2} &>- node3 ==> print_result |
|
返回顶楼 | |
发表时间:2009-05-15
ray_linn 写道 Trustno1 写道 Concurrency 是一个trival问题.Parallelism是No-trival的问题,不存在一个可以屏蔽掉所有细节的platform或者API集.换一句话说Parallelism很大程度上不是一个工程问题,更多的是算法问题甚至是数学问题.举个最简单的例子,如何并行计算Fabbonic数列?
你指的是f(n-1)和f(n-2)之后采用并行? 常规的递归和非递归算法都是无法并行的,最好的情况也是o(n)的线性算法. 通项公式可以在一定范围内并行,但是超过一定的n就有很大的精度误差. |
|
返回顶楼 | |
发表时间:2009-05-15
最后修改:2009-05-15
Trustno1 写道 ray_linn 写道 Trustno1 写道 Concurrency 是一个trival问题.Parallelism是No-trival的问题,不存在一个可以屏蔽掉所有细节的platform或者API集.换一句话说Parallelism很大程度上不是一个工程问题,更多的是算法问题甚至是数学问题.举个最简单的例子,如何并行计算Fabbonic数列?
你指的是f(n-1)和f(n-2)之后采用并行? 常规的递归和非递归算法都是无法并行的,最好的情况也是o(n)的线性算法. 通项公式可以在一定范围内并行,但是超过一定的n就有很大的精度误差. 让F(n-1)和F(n-2)各在一个线索上跑,至少也可以double一倍(理论上)。 axum如此写 node1=n-1 node2=n-2 node3=f(n) { PrimaryChannel::Num1 ==> node1, PrimaryChannel::Num1 ==> node2 } &>- ipJoin -<: { node3, node3 } >>- PrimaryChannel::Sum; axum应该还可以通过票据来实现并行。。不过我还没仔细想过。 |
|
返回顶楼 | |
发表时间:2009-05-15
最后修改:2009-05-15
ray_linn 写道 Trustno1 写道 Concurrency 是一个trival问题.Parallelism是No-trival的问题,不存在一个可以屏蔽掉所有细节的platform或者API集.换一句话说Parallelism很大程度上不是一个工程问题,更多的是算法问题甚至是数学问题.举个最简单的例子,如何并行计算Fabbonic数列?
Axum很简单啊 node1=[(1+√5)/2]^n node2=[(1-√5)/2]^n node3=(√5)*{node1-node2 } Axum代码 n -<< {node1,node2} &>- node3 ==> print_result 耍小聪明是不行滴.....不信你去试试看,让你算f(100),保证你算不出2550.这种算法有精度问题不说, 如果求n=100,递归算法是100次加法,你这个要200次乘法.你要达到递归算法的复杂度得跑两个cpu才行,这不是吃饱了撑的的么. 如果你是普通递归 f(n)=f(n-2)+f(n-1).不管你在几个CPU上跑都不会超过线性的尾递归算法. 如果是尾递归算法,是无法并行的. |
|
返回顶楼 | |
发表时间:2009-05-15
最后修改:2009-05-15
Trustno1 写道 ray_linn 写道 Trustno1 写道 Concurrency 是一个trival问题.Parallelism是No-trival的问题,不存在一个可以屏蔽掉所有细节的platform或者API集.换一句话说Parallelism很大程度上不是一个工程问题,更多的是算法问题甚至是数学问题.举个最简单的例子,如何并行计算Fabbonic数列?
Axum很简单啊 node1=[(1+√5)/2]^n node2=[(1-√5)/2]^n node3=(√5)*{node1-node2 } Axum代码 n -<< {node1,node2} &>- node3 ==> print_result 耍小聪明是不行滴.....不信你去试试看,让你算f(100),保证你算不出5050.这种算法有精度问题不说, 如果求n=100,递归算法是100次加法,你这个要200次乘法.你要达到递归算法的复杂度得跑两个cpu才行,这不是吃饱了撑的的么. 参见方法2,2个线程,各跑一只。 |
|
返回顶楼 | |
发表时间:2009-05-15
最后修改:2009-05-15
ray_linn 写道 Trustno1 写道 ray_linn 写道 Trustno1 写道 Concurrency 是一个trival问题.Parallelism是No-trival的问题,不存在一个可以屏蔽掉所有细节的platform或者API集.换一句话说Parallelism很大程度上不是一个工程问题,更多的是算法问题甚至是数学问题.举个最简单的例子,如何并行计算Fabbonic数列?
Axum很简单啊 node1=[(1+√5)/2]^n node2=[(1-√5)/2]^n node3=(√5)*{node1-node2 } Axum代码 n -<< {node1,node2} &>- node3 ==> print_result 耍小聪明是不行滴.....不信你去试试看,让你算f(100),保证你算不出5050.这种算法有精度问题不说, 如果求n=100,递归算法是100次加法,你这个要200次乘法.你要达到递归算法的复杂度得跑两个cpu才行,这不是吃饱了撑的的么. 参见方法2,2个线程,各跑一只。 尾递归一个CPU就比你快了,n=100 f(n-1) 99次加法,fun(n-2) 98次加法.这还不算上堆栈和thread的开销. |
|
返回顶楼 | |
发表时间:2009-05-15
最后修改:2009-05-15
比 fib 速度请用 C,循环用 goto。C 写的单线程算法就打翻 VM 语言好多个核了。
不过聊天室的 concurrency 和 parallel 真的没什么联系…… 瓶颈不在 cpu,在 io 和锁。所以 C 算得快也没多大帮助。 |
|
返回顶楼 | |
发表时间:2009-05-15
最后修改:2009-05-15
Trustno1 写道 ray_linn 写道 Trustno1 写道 ray_linn 写道 Trustno1 写道 Concurrency 是一个trival问题.Parallelism是No-trival的问题,不存在一个可以屏蔽掉所有细节的platform或者API集.换一句话说Parallelism很大程度上不是一个工程问题,更多的是算法问题甚至是数学问题.举个最简单的例子,如何并行计算Fabbonic数列?
Axum很简单啊 node1=[(1+√5)/2]^n node2=[(1-√5)/2]^n node3=(√5)*{node1-node2 } Axum代码 n -<< {node1,node2} &>- node3 ==> print_result 耍小聪明是不行滴.....不信你去试试看,让你算f(100),保证你算不出5050.这种算法有精度问题不说, 如果求n=100,递归算法是100次加法,你这个要200次乘法.你要达到递归算法的复杂度得跑两个cpu才行,这不是吃饱了撑的的么. 参见方法2,2个线程,各跑一只。 尾递归一个CPU就比你快了,n=100 f(n-1) 99次加法,fun(n-2) 98次加法.这还不算上堆栈和thread的开销. 这当然是和f(n-1)+f(n-2)的算法比,否则有啥可比性? |
|
返回顶楼 | |