[R-sig-hpc] Why pure computation time in parallel is longer than the serial version?
Roger Bivand
Roger.Bivand at nhh.no
Sat Feb 22 19:33:15 CET 2014
On Sat, 22 Feb 2014, beleites,claudia wrote:
> Hi Xuening,
>
> 2 physical vs 2 physical * 2 logical threads: See e.g. here:
> http://unix.stackexchange.com/a/88290
>
> You say you have 2 *physical* cores. That's the number you want to use
> for the parallel execution. Logical cores are just 2 (or more) threads
> running on the same physical core. IIRC, this can speed up things mainly
> if the 2 threads run very different operations.
Yes, this is my experience - I turn off Intel hyperthreads in BIOS to
prevent software getting confused. BLAS sees available compute resources,
so your BLAS may be installed to see 4 cores, but doesn't know that two
are hyperthreads and compete for physical resources. It may be that by
limiting BLAS to 2, it gets privileged access to the two real cores, and
other OS (or other) tasks running at the same time use the hyperthreads.
Roger
>
> I think this does not help the BLAS because there you have massive
> amounts of the *same* operations and they can easily be parallelized.
> Instead, you get overhead and maybe caching/scheduling "conflicts".
>
> I think if you want to profit from the 2 phys * 2 log. thread
> architecture, you'd need to optimize compilation to be aware of this.
> But even then I'd not expect too much here: 2 threads on the physical
> cores probably don't leave much space for other calculations to be done
> "meanwhile".
>
> All in all, I think it is just the same behaviour you see when
> scheduling more threads than cores in general (e.g. on a machine that
> has 1 logical core per physical core).
>
> HTH,
>
> Claudia
>
>
>
>
> --
> Claudia Beleites, Chemist
> Spectroscopy/Imaging
> Leibniz Institute of Photonic Technology
> Albert-Einstein-Str. 9
> 07745 Jena
> Germany
>
> email: claudia.beleites at ipht-jena.de
> phone: +49 3641 206-133
> fax: +49 2641 206-399
>
>
> ________________________________________
> Von: r-sig-hpc-bounces at r-project.org [r-sig-hpc-bounces at r-project.org]" im Auftrag von "Xuening Zhu [puddingnnn529 at gmail.com]
> Gesendet: Samstag, 22. Februar 2014 11:30
> An: Roger Bivand
> Cc: r-sig-hpc at r-project.org
> Betreff: Re: [R-sig-hpc] Why pure computation time in parallel is longer than the serial version?
>
> Roger,
> Much thanks to you~ I've done some further experiments to exploit something
> like openblas for parallel.
> My cpu is *Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz.* There are 2 physical
> cores and additional 2 logical cores. The memory size is 8G. And my
> operating system is unbuntu 12.04.
>
> I choose a 10^3 * 10^4 matrix and wants to evaluate its
> multiplication(t(m)%*%m) time. I don't consider tcrossprod() because I just
> want to make the computation longer. Maybe more cases can be compared later.
>
> The R (3.0.2) is re-compiled with open-blas. Inline function is employed to
> change the number of threads are defined as below:
> require(inline)
> openblas.set.num.threads <- cfunction( signature(ipt="integer"),
> body =
> 'openblas_set_num_threads(*ipt);',
> otherdefs = c ('extern void
> openblas_set_num_threads(int);'),
> libargs = c
> ('-L/home/pudding/OpenBLAS/ -lopenblas'),
> language = "C",
> convention = ".C")
> ##################################################################################
>
> First I only compare open-blas with default R BLAS in the experiment:
> (1) multiplication with the default R BLAS:
>
>> mat = matrix(1:1e7,ncol=1e4)> system.time(t(mat)%*%mat) user system elapsed
> 84.517 0.320 85.090
>
>
> (2) open-blas with 2 threads specified:
>
>> openblas.set.num.threads(2)
> $ipt
> [1] 2
>> system.time(t(mat)%*%mat)
> user system elapsed
> 10.164 0.512 5.549
>
> (3) open-blas with 4 threads specified:
>
>> openblas.set.num.threads(4)
> $ipt
> [1] 4
>
>> system.time(t(mat)%*%mat)
> user system elapsed
> 26.954 1.556 8.147
>
> Things is a little strange that 4 threads is even slower than 2 threads!
>
> ##################################################################
> Then I want to mix multicore with open-blas. I try to change the implicit
> parallel of matrix multiplication into explicit version. So I just split
> the data into several partitions and Things become very wired here.
>
> (1) First I specify the number of threads to be 1 in open-blas, and 2 cores
> are used in mclapply:
>> openblas.set.num.threads(1)
> $ipt
> [1] 1
>
>> system.time({
> + group = sample(rep(1:8,length.out=ncol(mat)))
> + mm = lapply(split(seq(ncol(mat)),group),function(i) mat[,i])
> + #mcaffinity(1:8)
> + #system(sprintf("taskset -p 0xffffffff %d", Sys.getpid()))
> + #cores = detectCores()
> + a = mclapply(mm,function(m){
> + cat('Running!!\n')
> + t(m)%*%m
> + #tcrossprod(m)
> + },mc.cores=2)
> + b = Reduce("+",a)
> + })
> Running!!
> Running!!
> Running!!
> Running!!
> Running!!
> Running!!
> Running!!
> Running!!
> user system elapsed
> 0.352 0.168 1.363
>
> (2) Then I change cores in mclapply (in parallel package) from 2 to 4. The
> time is even longer as below. (Sometimes it even gives me a segfault error
> but unfortunately I have no means to reproduce it ><.)
>
>> system.time({
> + group = sample(rep(1:8,length.out=ncol(mat)))
> + mm = lapply(split(seq(ncol(mat)),group),function(i) mat[,i])
> + #mcaffinity(1:8)
> + #system(sprintf("taskset -p 0xffffffff %d", Sys.getpid()))
> + #cores = detectCores()
> + a = mclapply(mm,function(m){
> + cat('Running!!\n')
> + t(m)%*%m
> + #tcrossprod(m)
> + },mc.cores=4)
> + b = Reduce("+",a)
> + })
> Running!!
> Running!!
> Running!!
> Running!!
> Running!!
> Running!!
> Running!!
> Running!!
> user system elapsed
> 0.400 0.148 1.597
>
> (3) When I change the number of threads from 1 to some number>1, I can't
> have results being returned from mclapply any more. There are some
> conflicts between mclapply and open-blas multi-threads speeding algorithm,
> I guess.
>
>
> 2014-02-18 18:38 GMT+08:00 Roger Bivand <Roger.Bivand at nhh.no>:
>
>> wesley goi <wesley at ...> writes:
>>
>>>
>>> Hi xuening,
>>>
>>> I use multicore's mclapply() function extensively and have recently
>>> changed the BLAS lib to openblas to help with running a PCA on a big
>>> matrix, everything ran fine. However, I was wondering if the openblas
>>> lib will interfere with multicore.
>>>
>>> So i guess so far thereâ EURO (tm)s no way to assigned the threads which
>>> openblas uses hence it shdnt be used in a multicore script to be
>>> submitted to a cluster else itâ EURO'll consume all the cores?
>>
>> Please do use the list archives; the thread:
>>
>> https://stat.ethz.ch/pipermail/r-sig-hpc/2012-April/001339.html
>>
>> provides much insight into the AFFINITY issue - see also mcaffinity()
>> in the parallel package. If your BLAS is trying to use all available
>> cores anyway, and you then try to run in parallel on top of that, your
>> high-level processes will compete across the available cores for
>> resources with BLAS, as each BLAS call on each core will try to
>> spread work across the same set of cores. Please also see:
>>
>> http://www.jstatsoft.org/v31/i01/
>>
>> and perhaps also:
>>
>> http://ideas.repec.org/p/hhs/nhheco/2010_025.html
>>
>> Neither are new, but are based on trying things out rather than
>> speculating. As pointed out before, Brian's comment tells you what you
>> need to know:
>>
>> https://stat.ethz.ch/pipermail/r-sig-hpc/attachments/20140213/662780c9/
>> attachment.pl
>>
>> Hope this clarifies,
>>
>> Roger
>>
>>>
>>> On 18 Feb, 2014, at 11:25 am, Xuening Zhu <puddingnnn529 at ...> wrote:
>>>
>>>> Hi Wesley:
>>>> I installed open-blas before. It went well when I run serial
>>> operations. 2 threads can be seen in 'top'. But
>>> I can't change thread number through the methods it provided.
>>
>> _______________________________________________
>> R-sig-hpc mailing list
>> R-sig-hpc at r-project.org
>> https://stat.ethz.ch/mailman/listinfo/r-sig-hpc
>>
>
>
>
> --
> Xuening Zhu
> --------------------------------------------------------
> Master of Business Statistics
> Guanghua School of Management, Peking University
>
> [[alternative HTML version deleted]]
>
>
--
Roger Bivand
Department of Economics, Norwegian School of Economics,
Helleveien 30, N-5045 Bergen, Norway.
voice: +47 55 95 93 55; fax +47 55 95 95 43
e-mail: Roger.Bivand at nhh.no
More information about the R-sig-hpc
mailing list