Question

I am trying to create an mpi program that will run my bellard function to calculate pi to ten thousand decimal places. When i compile the program i get the following error:

error: invalid operands to binary + (have ‘float *’ and ‘float *’)

The line it points to in terminal is: pi=pi+tmpPi;

Can anyone help me fix this error and if you spot anything else wrong with this program, please feel free to say so, any help would be greatly appreciated.

My Code:

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <mpi/mpi.h>

#define PRECISION 10000


float minus_one,one,two,three,four,five,six,seven,eight,nine,ten,   
    thirty_two,sixty_four,two_five_six,one_zero_two_four,
    two_pow_six,recip_two_pow_six;


float *pi;
int rank,size;

void init(){
    minus_one = -1.0;
    one = 1.0;
    two = 2.0;
    three = 3.0;
    four = 4.0;
    five = 5.0;
    six = 6.0;
    seven = 7.0;
    eight = 8.0;
    nine = 9.0;
    ten = 10.0;
    thirty_two = 32.0;
    sixty_four = 64.0;
    two_five_six = 256.0;
    one_zero_two_four = 1024.0;
    two_pow_six = pow(two,6);
    recip_two_pow_six = one/two_pow_six;

    pi = 0;

    return;
}

float *bellard(int start, int end,int rank){
    float *terms,t,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,
        t13,t14,t15,t16,t17,tx,ty,tz;

    int offset = rank;
    int start_k = start, end_k = end;
    start_k = offset * (PRECISION /size);
    end_k = (offset+1) * (PRECISION/size);

    int k = start_k;

    while( (k<PRECISION) && (k<end_k)){
        t1 = k;
        t2 = t1*ten;
        t3 = t2+one;
        t4 = two_five_six/t3;
        t5 = t2+nine;
        t6 = one/t5;
        t7 = t2+three;
        t8 = sixty_four/t7;
        t9 = four*t1;
        t10 = t9+one;
        t11 = thirty_two/t10;
        t12 = t2+five;
        t13 = four/t12;
        t14 = t2+seven;
        t15 = four/t14;
        t16 = t9+three;
        t17 = one+t16;

        t = t4+t6;
        t = t-t8;
        t = t-t11;
        t = t-t13;
        t = t-t15;
        t = t-t17;

        tx = pow(minus_one,k);
        ty = pow(one_zero_two_four,k);
        tz = tx/ty;
        *terms = tz*t;

        //pi = pi+terms;
        k = k+1;
    }
        return terms;
}

int main(int argc, char** argv){


    int i;
    MPI_Status status;
    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    int elementsCount = 10000/(size-1);

    if(rank == 0){
        float *tmpPi;

        for(i=1; i < size; i++){
            MPI_Recv(tmpPi,elementsCount,MPI_FLOAT,i,1,MPI_COMM_WORLD,&status);
            pi=pi+tmpPi;
        }
    }else{

        //int i;
        float *workerPi;
        int start,end,slice,workers;
        workerPi = malloc(sizeof(int)*elementsCount);
        workers = size-1;
        slice = 10000/workers;
        start = (rank-1)*slice;
        end = start+slice;

        printf("Worker %d processing data %d to %d\n",rank,start,end);

        workerPi = bellard(start,end,rank);

        MPI_Send(workerPi,slice,MPI_FLOAT,0,1,MPI_COMM_WORLD);

    }

    MPI_Finalize();

    return 0;
}
Was it helpful?

Solution

You are trying to add two pointers together.

Instead of

float *pi;
float *tmpPi;
...
pi=pi+tmpPi;

Try:

float *pi;
float *tmpPi;
...
*pi = *pi + *tmpPi;

This will dereference the pointers pi and tmpPi, add the values together, then write the result to the location pointed to by pi.

OTHER TIPS

Since pi and tmpPi are both pointers, change:

pi=pi+tmpPi;

in:

*pi = *pi + *tmpPi;

pi and tmpPi are pointers, so you need to dereference them;

  *pi = *pi + *tmpPi
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top