/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include /* Returns the MPI node number where data indexes index is */ int my_distrib(int x, int y, int nb_nodes) { return (x+y) % nb_nodes; } void cpu_codelet(void *descr[], void *_args) { float *block; unsigned nx = STARPU_MATRIX_GET_NY(descr[0]); unsigned ld = STARPU_MATRIX_GET_LD(descr[0]); unsigned i,j; int rank; float factor; block = (float *)STARPU_MATRIX_GET_PTR(descr[0]); starpu_unpack_cl_args(_args, &rank); factor = block[0]; //fprintf(stderr,"rank %d factor %f\n", rank, factor); for (j = 0; j < nx; j++) { for (i = 0; i < nx; i++) { //fprintf(stderr,"rank %d factor %f --> %f %f\n", rank, factor, block[j+i*ld], block[j+i*ld]*factor); block[j+i*ld] *= factor; } } } static starpu_codelet cl = { .where = STARPU_CPU, .cpu_func = cpu_codelet, .nbuffers = 1 }; int main(int argc, char **argv) { int rank, nodes; float ***bmat; starpu_data_handle *data_handles; unsigned i,j,x,y; unsigned nblocks=4; unsigned block_size=2; unsigned size = nblocks*block_size; unsigned ld = size / nblocks; starpu_init(NULL); starpu_mpi_initialize_extended(&rank, &nodes); if (rank == 0) { /* Allocate the matrix */ int block_number=10; bmat = malloc(nblocks * sizeof(float *)); for(x=0 ; x