A humble request/challenge


#1

Hi

I primarly use Ruby for math/science problems/projects because it’s so easy to program in, and it allows me to think about how to solve problems without worrying about how to code it. I’ve also played around with Crystal (aka Ruby on steroids) but it’s still young, and doesn’t let me (currently) do what I want, or without a lot of hassles, and I’ve just recently started looking at Nim (less than a month at time of writing).

I heard about Julia sometime in 2016(?) but never had any time/reason to learn it. But now maybe I have incentive to do so.

I developed a prime sieve called the Sieve of Zakiya (SoZ), and it’s companion the Segmented Sieve of Zakiya (SSoZ). I wrote a paper, The Segmented Sieve of Zakiya (SSoZ) which describes its mathematical foundations and algorithm, and provide a working C++ implementation at the end of the paper (compiled, run, and verified), though I don’t consider myself a C++ programmer, just funcitonal enough in it. It’s a relatively short program.

Here’s a link to read and download the paper:

My humble request/challenge is for a/some skilled Julians (?) to translate the code into idiomatic Julia to demonstrate the best way to code the algorithm in it. Extra points if someone can do a true parallel version of the algorithm, which I attempted to do using OpemMP, but what I did didnt’ seem to make the code faster than the serial version (see paper).

I assume coding this the Julia way would look different than the C++ code, and be quite different than a direct translation into Julia using the same (probably suboptimal) structure.

Ultimately, I’d like to publish the results of benchmarks in different languages doing the SSoZ in an updated paper.

If anyone would be willing to take up the challenge I’d be pleased to answer any questions the best I can.

Thanks in advance.

Jabari


#2

Actually, writing code in Julia in a C/C++/Fortran style (just all looping) should get about the same performance as C/C++/Fortran. Of course, there probably ways you can do it to make the code both much more compact and also more generic (without losing performance of course), but if you just write an algorithm as straight loops on arrays of Float64 you’ll be fine if you put it in a function and make sure it’s type-stable.


#3

I’m particualry interested in performing the alogiirthm using parallel processing, which I thought Julia was specifically designed to do. I assume the memory model used in the serial C++ version may have to change, but I don’t know enough about Julia to assess the details of performing parallel processing.


#4

OpenMP-style code is well suited to parallelize with Julia’s multithreading. However, the issue that you noted is that the C++ parallel version didn’t do well, and so I don’t think you’ll get good parallel performance anywhere until you can sort out how to fundamentally parallelize the algorithm.


#5

A nice thing about Julia is that the simpler forms of parallelism are easy to try. Your code looks like it might be amenable. It is that it’s easy to throw an @simd on the front of a loop to see what it buys you in terms of SIMD-type parallelism. You can also try using threads with @thread around an outer loop.


#6

Some of your arrays are small enough, you could probably benefit from StaticArrays: