How to use #pragma omp parallel for collapse(n) in dlang?

Daniel Kozak kozzi11 at gmail.com
Thu Aug 15 08:08:29 UTC 2019


On Thu, Aug 15, 2019 at 9:44 AM Daniel Kozak <kozzi11 at gmail.com> wrote:
>
> On Tue, Aug 13, 2019 at 10:47 AM ijet via Digitalmars-d-learn
> <digitalmars-d-learn at puremagic.com> wrote:
> >
> > How to use #pragma omp parallel for collapse(n) in dlang?
>
> There is no OMP for de as I know, but you can just use
> https://dlang.org/phobos/std_parallelism.html#.parallel
> for each 'foreach'

something like this:
C version:

#include <stdio.h>
#define CNT 400000

int isprime(int num)
{
     if (num <= 1) return 0;
     if (num % 2 == 0 && num > 2) return 0;
     for(int i = 3; i < num / 2; i+= 2)
     {
         if (num % i == 0)
             return 0;
     }
     return 1;
}


int fun(int a, int b)
{
return isprime(a) + isprime(b);
}

int main() {
int buff[CNT];
int i, j;
#pragma omp parallel for private(j) collapse(2)
for (i = 0; i < 4; i++)
    for (j = 0; j < 100000; j++)
buff[i*100000 + j] = fun(i, j);

for (int x = 0; x < CNT; x++)
{
printf("%d\n", buff[x]);
}
return 0;
}

D version:

import core.stdc.stdio;
import std.parallelism;
import std.range : iota;

enum CNT = 400000;

int isprime(int num)
{
     if (num <= 1) return 0;
     if (num % 2 == 0 && num > 2) return 0;
     for(int i = 3; i < num / 2; i+= 2)
     {
         if (num % i == 0)
             return 0;
     }
     return 1;
}


int fun(int a, int b)
{
    return isprime(a) + isprime(b);
}

int main(string[] args)
{
    int[CNT] buff = void;

    foreach (i; iota(0,4).parallel)
        foreach (j; iota(0, 100000).parallel)
            buff[i*100000 + j] = fun(i, j);

    for (int x = 0; x < CNT; x++)
    {
        printf("%d\n", buff[x]);
    }
    return 0;
}


More information about the Digitalmars-d-learn mailing list