problem with parallel foreach

John Colvin via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue May 12 08:11:48 PDT 2015


On Tuesday, 12 May 2015 at 15:11:01 UTC, John Colvin wrote:
> On Tuesday, 12 May 2015 at 14:59:38 UTC, Gerald Jansen wrote:
>> I am a data analyst trying to learn enough D to decide whether 
>> to use D for a  new project rather than Python + Fortran. I 
>> have recoded a non-trivial Python program to do some simple 
>> parallel data processing (using the map function in Python's 
>> multiprocessing module and parallel foreach in D). I was very 
>> happy that my D version ran considerably faster that Python 
>> version when running a single job but was soon dismayed to 
>> find that the performance of my D version deteriorates rapidly 
>> beyond a handful of jobs whereas the time for the Python 
>> version increases linearly with the number of jobs per cpu 
>> core.
>>
>> The server has 4 quad-core Xeons and abundant memory compared 
>> to my needs for this task even though there are several 
>> million records in each dataset. The basic structure of the D 
>> program is:
>>
>> import std.parallelism; // and other modules
>> function main()
>> {
>>    // ...
>>    // read common data and store in arrays
>>    // ...
>>    foreach (job; parallel(jobs, 1)) {
>>        runJob(job, arr1, arr2.dup);
>>    }
>> }
>> function runJob(string job, in int[] arr1, int[] arr2)
>> {
>>    // read file of job specific data file and modify arr2 copy
>>    // write job specific output data file
>> }
>>
>> The output of /usr/bin/time is as follows:
>>
>> Lang Jobs    User  System  Elapsed %CPU
>> Py      1   45.17    1.44  0:46.65   99
>> D       1    8.44    1.17  0:09.24  104
>>
>> Py      2   79.24    2.16  0:48.90  166
>> D       2   19.41   10.14  0:17.96  164
>>
>> Py     30 1255.17   58.38  2:39.54  823 * Pool(12)
>> D      30  421.61 4565.97  6:33.73 1241
>>
>> (Note that the Python program was somewhat optimized with 
>> numpy vectorization and a bit of numba jit compilation.)
>>
>> The system time varies widely between repititions for D with 
>> multiple jobs (eg. from 3.8 to 21.5 seconds for 2 jobs).
>>
>> Clearly simple my approach with parallel foreach has some 
>> problem(s). Any suggestions?
>>
>> Gerald Jansen
>
> Have you tried adjusting the workUnitSize argument to parallel? 
> It should probably be 1 for such large individual tasks.

ignore me, i missed that you already had done that.


More information about the Digitalmars-d-learn mailing list