# What's a good method to decide wheter distributed or parallel computing?

I've already programed a grammatical evolution on GPU with a very satisfactory result (an improvement on time of about 140% with relative small datasets, expecting better results whith big ones). Currently, using CUDA, I just 'fill' one core on my GPU, having a low memory usage so i'm thinking about filling every multiprocesor by executing the same code. I'm talking, of course, of populating synchronous islands and using them as ecosystems with ocasional information sharing.

I've thought aswell on modifiying my algorithm for being run on a homemade raspberry cluster (not built yet) and treat every raspberry as an island aswell.

My problem is that, without implementing both systems, I don't know how to calculate or estimate what the best approach will be or knowing if the number of cores will result on a better execution time.

I know there are values i'll have to take in consideration, such as FLOPS of both systems, number of CUDA cores or raspberries, memory bandwidth ,etc. But i'd like to make a equation as exact as possible and I don't even know how to start to deal with the problem.

I know that is a very general problem, any suggestion will be listened to. I'm can provide any further information by editing the question

Thank you

Edit 1: In order to clarify the two first comments below this post i'll edit at here:

@Raphael♦ There will be communication about once every 10 seconds, with a transference of a bidimensional array of int[255][10] I'm not sure, maybe (probably) i'll be able to fit the memory of a raspberry. The most important memory size used contains on every thread a matrix of int[255][500]. The communication between the threads have not to be synchronous at all, they could be synchronized with a random couple they found free on that moment.

@TRex22 It's good to know that rasps aren't a good testing evnironement for researching purposes. My algorithm takes an input with an array of two or three points (x,y) or (x,y,z) and calculates the mathematical function f(x)=y or f(x,y) = z. The big matrix i have mentioned before, are DNA which codifies results for productions in a grammar (grammatical evolution). In my current algorithm the bandwith is not REALLY important, because every generation i'll only transfer the best solution (with a size of int[255]). Thanks anyway for your suggestion on OpenMP an MPI, i'll take a look.

• It depends on the algorithm. How much communication between computational units is there? Can you fit all you need into memory on one unit? How small are the (mostly) independent jobs you can create? – Raphael Jun 19 '17 at 17:32
• Also Cuda cores and other subdivisions in the Cuda architecture are not comparable to normal processors or even the graphics chips in a Raspberry PI. Please clarify what you are attempting to do. Raspberry PI projects are great for learning but in my experience Cuda should perform better than a PI for very specific non-general work. CUDA does have far greater memory bandwidth to a PI. Maybe look at Parallel Programming in C with MPI and OpenMP. Its for other HPC technologies but covers in-depth how to analyse algorithms analytically. – TRex22 Jun 19 '17 at 20:29