Accéder au contenu.
Menu Sympa

starpu-devel - [Starpu-devel] Starpu-mpi

Objet : Developers list for StarPU

Archives de la liste

[Starpu-devel] Starpu-mpi


Chronologique Discussions 
  • From: alankrutha reddy <alankruthareddy46@gmail.com>
  • To: starpu-devel@lists.gforge.inria.fr
  • Subject: [Starpu-devel] Starpu-mpi
  • Date: Mon, 22 Jul 2013 17:13:48 +0530
  • List-archive: <http://lists.gforge.inria.fr/pipermail/starpu-devel>
  • List-id: "Developers list. For discussion of new features, code changes, etc." <starpu-devel.lists.gforge.inria.fr>

Hi,
 
  I have tried the attached program which counts the no. of prime numbers with Starpu-MPI. I'm not getting result. I'm not understanding where is the problem. Can anyone help me.

--
Regards
Alankrutha
#include<starpu_mpi.h>
#include<stdio.h>
#include<math.h>

#define LIMIT 30
#define FIRST 0

void prime_cpu_func(void *descr[], void *cl_arg)
{
	int *mystart_1 = (int *)STARPU_VARIABLE_GET_PTR(descr[0]);
	int *stride_1 = (int *)STARPU_VARIABLE_GET_PTR(descr[1]);
	int *pc_1 = (int *)STARPU_VARIABLE_GET_PTR(descr[2]);

	int n, mystart, stride, pc;
	mystart = *mystart_1;
	stride = *stride_1;
	pc = *pc_1;

	for(n=mystart; n<=LIMIT; n+=stride)
	{
		int i,squareroot, count=0;
		if (n>10) {
			squareroot = (int) sqrt(n);
			for (i=3; i<=squareroot; i=i+2)
				if ((n%i)==0)
					count=0;
			count++;
		}
		else
			count=0;
		if(count)
			pc++;
	}
	*pc_1 = pc;
}

static struct starpu_codelet cl =
{
	.where = STARPU_CPU,
	.cpu_funcs = {prime_cpu_func, NULL},
	.nbuffers = 3,
	.modes = {STARPU_RW, STARPU_RW, STARPU_RW}
};

int main(int argc, char **argv)
{
	int my_rank, size;
	int pc, pcsum;
	int mystart, stride, n;

	int ret = starpu_init(NULL);
	STARPU_CHECK_RETURN_VALUE(ret, "starpu_init");
	starpu_mpi_initialize_extended(&my_rank, &size);

	if(((size%2) != 0)||((LIMIT%size) != 0))
	{
		printf("sorry - this requires an even number of tasks.\nevenly divisible into %d.  Try 4 or 8.\n",LIMIT);
		starpu_mpi_shutdown();
		starpu_shutdown();
	}

	mystart = (my_rank*2)+1;
	stride = size*2;
	pc=0;

	starpu_data_handle_t data_handle1, data_handle2, data_handle3;


	starpu_variable_data_register(&data_handle1, 0, (uintptr_t)&mystart, sizeof(mystart));
	starpu_variable_data_register(&data_handle2, 0, (uintptr_t)&stride, sizeof(stride));
	starpu_variable_data_register(&data_handle3, 0, (uintptr_t)&pc, sizeof(pc));

                struct starpu_task *task = starpu_task_create();

                task->cl = &cl;
                task->callback_func =NULL;
                task->handles[0] = data_handle1;
                task->handles[1] = data_handle2;
                task->handles[2] = data_handle3;

                ret = starpu_task_submit(task);
                if (STARPU_UNLIKELY(ret == -ENODEV))
                {
                        printf("No worker may execute this task\n");
                        exit(0);
                }



	if(my_rank == FIRST)
	{
		pc+=4;
		MPI_Reduce(&pc, &pcsum, 1, MPI_INT, MPI_SUM, FIRST, MPI_COMM_WORLD);
	}

	if(my_rank > FIRST)
	{
		 MPI_Reduce(&pc, &pcsum, 1, MPI_INT, MPI_SUM, FIRST, MPI_COMM_WORLD);
	}

	starpu_mpi_shutdown();
	starpu_shutdown();

return 0;
}



Archives gérées par MHonArc 2.6.19+.

Haut de le page