My initial impression, here, is BLAS is written in fortran, suggesting that there's something wrong with the C language and/or compilers, for generating efficient numerical code.
-- Raul On Tue, May 7, 2013 at 9:17 AM, Elton Wang <[email protected]> wrote: > In short, J raw matrix multiplication is about 9x slower than others in the > test, and it seems all of them use blas library for matrix multiplication. ( > r was slower but I tried to replace rblas.dll with a faster gotoblas and it > immediately pulled r' speed on this test on par with others.) > > On May 7, 2013, at 8:36 AM, Ric Sherlock <[email protected]> wrote: > >> Duh! >> Thanks. Must be time for bed!!! >> >> >> On Wed, May 8, 2013 at 12:29 AM, Raul Miller <[email protected]> wrote: >> >>> multiplying milliseconds by 1000 would give microseconds. >>> >>> also, the original post says "in milsec" >>> >>> FYI, >>> >>> -- >>> Raul >>> >>> On Tue, May 7, 2013 at 8:15 AM, Ric Sherlock <[email protected]> wrote: >>>> Your timeit verb is defined as 1000 times the result of 6!:2 >>>> >>>> Could it be that you are expecting the result of 6!:2 to be milliseconds, >>>> when it is actually already reporting seconds? >>>> >>>> On Tue, May 7, 2013 at 12:00 PM, elton wang <[email protected]> wrote: >>>> >>>>> Julia is a new number crunching language that claims to have near c >>> speed. >>>>> On their homepage there is a set of benchmark to compare Julia with >>>>> matlab/python/R etc. I made a try to add J into the table.Please see >>> table >>>>> below for my results. All programs runs on a windows 64 bit machine. My >>>>> script enclosed at the end of this message. Welcome to improve it >>> since I >>>>> dont have any practical experience on J other than toy exercises. >>>>> >>>>> Please see http://julialang.org/ for the offical Julia benchmarks, and >>>>> links therein for source codes of other languages. (like >>>>> https://github.com/JuliaLang/julia/blob/master/test/perf/perf.m for the >>>>> matlab code.) >>>>> >>>>> >>>>> >>>>> note that in the random matrix multiply test, J lags behind all other >>>>> peers. The code I use is >>>>> >>>>> rand_nn =. 0 ?@$~ 2 # ] >>>>> mp =. +/ . * >>>>> randmatmul =. rand_nn mp rand_nn >>>>> 1000 * 6!:2 'randmatmul 1000' >>>>> >>>>> I suspect that other languages use some library like BLAS for matrix >>>>> rather than raw calculation. Is there a way to speed up code above? >>>>> >>>>> results: >>>>> in milsec Julia Matlab2013a R3.0.0 Python3.3+numpy(MKL) J801 >>>>>> fib <1 123 60 4 11 >>>>>> parse_int <1 163 10 5 7 >>>>>> mandel <1 13 230 8 47 >>>>>> quicksort <1 45 30 23 11 >>>>>> pi_sum 30 48 810 1192 64 >>>>>> rand_mat_stat 20 60 150 261 65 >>>>>> rand_mat_mul 210 216 880 90 1768 >>>>>> >>>>>> >>>>>> >>>>>> benchmark code: >>>>>> >>>>>> timeit =. 1000 * 6!:2 >>>>>> >>>>>> NB. double recursive fib. >>>>>> fib =. (-&2 +&$: -&1) ^: (1&<) >>>>>> >>>>>> timeit 'fib 20' >>>>>> >>>>>> NB. parse int >>>>>> parsintPerf =. 3 : 0 >>>>>> for. i.y do. >>>>>> a =. ?<:2^32x >>>>>> s =. ":a >>>>>> b =. ".s >>>>>> assert b = a >>>>>> end. >>>>>> ) >>>>>> >>>>>> timeit 'parsintPerf 1000' >>>>>> >>>>>> NB. mandel >>>>>> mandel =. 3 : 0 >>>>>> c =. y >>>>>> m =. 0 >>>>>> for_n. i.80 do. >>>>>> if. 2 <|y do. m =.n break. end. >>>>>> y =. c + *:y >>>>>> m =. n >>>>>> end. >>>>>> ) >>>>>> >>>>>> assert 14628 = +/+/ mandel"0 (_2 + 0.1*i.26) j./ (_1 + 0.1*i.21) >>>>>> timeit '+/+/ mandel"0 (_2 + 0.1*i.26) j./ (_1 + 0.1*i.21)' >>>>>> >>>>>> NB. quicksort >>>>>> quicksort=: (($:@(<#[) , (=#[) , $:@(>#[)) ({~ ?@#)) ^: (1<#) >>>>>> timeit 'quicksort ? 5000 $ 0' >>>>>> >>>>>> NB. pi sum >>>>>> pisum =. 3 : 'for. i.500 do. +/ %*:>:i.y end.' >>>>>> assert '1e_12 > | _1.644834071848065 + pisum 10000' >>>>>> timeit 'pisum 10000' >>>>>> >>>>>> NB. random matrix multiply. >>>>>> rand_nn =. 0 ?@$~ 2 # ] >>>>>> mp =. +/ . * >>>>>> randmatmul =. rand_nn mp rand_nn >>>>>> timeit 'randmatmul 1000' >>>>>> >>>>>> NB. rand mat stats/ >>>>>> load 'stats/base' >>>>>> randn_nn =. [: normalrand 2 # ] >>>>>> trace =. [: +/ (<0 1)&|: >>>>>> randstats =. 3 : 0 >>>>>> n =.5 >>>>>> v =. 0 >>>>>> w =. 0 >>>>>> for. i.y do. >>>>>> a =. randn_nn n >>>>>> b =. randn_nn n >>>>>> c =. randn_nn n >>>>>> d =. randn_nn n >>>>>> P =. a,.b,.c,.d >>>>>> Q =. (a,.b),c,.d >>>>>> PP =. P mp |:P >>>>>> QQ =. Q mp |:Q >>>>>> v =.v, trace PP mp PP mp PP mp PP >>>>>> w =. w, trace QQ mp QQ mp QQ mp QQ >>>>>> end. >>>>>> ((stddev % mean) v), ((stddev % mean) w) >>>>>> ) >>>>>> >>>>>> timeit 'randstats 1000' >>>>> ---------------------------------------------------------------------- >>>>> For information about J forums see http://www.jsoftware.com/forums.htm >>>> ---------------------------------------------------------------------- >>>> For information about J forums see http://www.jsoftware.com/forums.htm >>> ---------------------------------------------------------------------- >>> For information about J forums see http://www.jsoftware.com/forums.htm >> ---------------------------------------------------------------------- >> For information about J forums see http://www.jsoftware.com/forums.htm > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
