On 05/05/2014 10:25 AM, Ali Çehreli wrote:

> On 05/05/2014 10:14 AM, Caslav Sabani wrote:
>
>  > I want to have one array where I will store like 100000  objects.
>  >
> > But I want to use 4 threads where each thread will create 25000 objects
>  > and store them in array above mentioned.
>
> 1) If it has to be a single array, meaning that all of the objects are
> in consecutive memory, you can create the array and give four slices of
> it to the four tasks.
>
> To do that, you can either create a proper D array filled with objects
> with .init values; or you can allocate any type of memory and create
> objects in place there.

Here is an example:

import std.stdio;
import std.parallelism;
import core.thread;
import std.conv;

enum elementCount = 8;
size_t elementPerThread;

static this ()
{
    assert((elementCount % totalCPUs) == 0,
           "Cannot distribute tasks to cores evenly");

    elementPerThread = elementCount / totalCPUs;
}

void main()
{
    auto arr = new int[](elementCount);

    foreach (i; 0 .. totalCPUs) {
        const beg = i * elementPerThread;
        const end = beg + elementPerThread;
        arr[beg .. end] = i.to!int;
    }

thread_joinAll(); // (I don't think this is necessary with std.parallelism)

    writeln(arr);    // [ 0, 0, 1, 1, 2, 2, 3, 3 ]
}

> 2) If it doesn't have to a single array, you can have the four tasks
> create four separate arrays. You can then use them as a single range by
> std.range.chain.

That is a lie. :) chain would work but it had to know the number of total cores at compile time. Instead, joiner or join can be used:

import std.stdio;
import std.parallelism;
import core.thread;

enum elementCount = 8;
size_t elementPerThread;

static this ()
{
    assert((elementCount % totalCPUs) == 0,
           "Cannot distribute tasks to cores evenly");

    elementPerThread = elementCount / totalCPUs;
}

void main()
{
    auto arr = new int[][](totalCPUs);

    foreach (i; 0 .. totalCPUs) {
        foreach (e; 0 .. elementPerThread) {
            arr[i] ~= i;
        }
    }

thread_joinAll(); // (I don't think this is necessary with std.parallelism)

    writeln(arr);             // [[0, 0], [1, 1], [2, 2], [3, 3]]

    import std.range;
    writeln(arr.joiner);      // [ 0, 0, 1, 1, 2, 2, 3, 3 ]

    import std.algorithm;
    auto arr2 = arr.joiner.array;
    static assert(is (typeof(arr2) == int[]));
    writeln(arr2);           // [ 0, 0, 1, 1, 2, 2, 3, 3 ]

    auto arr3 = arr.join;
    static assert(is (typeof(arr3) == int[]));
    writeln(arr3);           // [ 0, 0, 1, 1, 2, 2, 3, 3 ]
}

> This option allows you to have a single array as well.

arr2 and arr3 above are examples of that.

Ali

Reply via email to