开发者

fread() in MPI is giving Signal 7 Bus Error

开发者 https://www.devze.com 2023-04-12 09:09 出处:网络
I am a newbie to C and MPI. I have the following code which I am using with MPI. #include \"RabinKarp.c\"

I am a newbie to C and MPI. I have the following code which I am using with MPI.

#include "RabinKarp.c"
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include<math.h>
#include </usr/include/mpi/mpi.h>

typedef struct {
    int lowerOffset;
    int upperOffset;
    int processorNumber;

} patternPartitioning;

int rank;
FILE *fp;

char* filename = "/home/rohit/Downloads/10_seqs_2000_3000_bp.fasta";
int n = 0;
int d = 0;
//number of processors
int k, i = 0, lower_limit, upper_limit;

int main(int argc, char** argv) {
    char* pattern= "taaat";
    patternPartitioning partition[k];
        MPI_Init(&argc, &argv);
        MPI_Comm_size(MPI_COMM_WORLD, &k);
        MPI_Comm_rank(MPI_COMM_WORLD, &rank);


    fp = fopen(filename, "rb");
    if (fp != '\0') {
        fseek(fp, 0L, SEEK_END);
        n = ftell(fp);
        fseek(fp, 0L, SEEK_SET);
    }


    //Do for Master Processor
    if(rank ==0){
    int m = strlen(pattern);
    printf("pattern length is %d \n", m);

    d = (int)(n - m + 1) / k;
        for (i = 0; i <= k - 2; i++) {
            lower_limit = round(i * d);
            upper_limit = round((i + 1) * d) + m - 1;
            partition->lowerOffset = lower_limit;
            partition->upperOffset = upper_limit;
            partition->processorNumber = i+1;

            // k-2 times calculate the limits like this
            printf(" the lower limit is %d and upper limit is%d\n",
                    partition->lowerOffset, partition->upperOffset);
            int mpi_send_block[2];
            mpi_send_block[0]= lower_limit;
            mpi_send_block[1] = upper_limit;
            MPI_Send(mpi_send_block, 2, MPI_INT, i+1, 开发者_JS百科i+1, MPI_COMM_WORLD);

            //int MPI_Send(void *buf, int count, MPI_Datatype dtype, int dest, int tag, MPI_Comm comm);
        }
        // for the last processor calculate the index here
        lower_limit = round((k - 1) * d);
        upper_limit = n;
        partition->lowerOffset = lower_limit;
        partition->upperOffset = n;
        partition->processorNumber = k;

        printf("Processor : %d : has start : %d  : and end : %d :\n",rank,partition->lowerOffset,partition->upperOffset);

        //perform the search here

        int size = partition->upperOffset-partition->lowerOffset;
        char *text = (char*) malloc (size);

fseek(fp,partition->lowerOffset , SEEK_SET);
fread(&text, sizeof(char), size, fp);
printf("read in rank0");
 fputs(text,stdout);


                int number =0;
 fputs(text,stdout);
fputs(pattern,stdout);
         number = rabincarp(text,pattern);
        for (i = 0; i <= k - 2; i++) {
            int res[1];
            res[0]=0;
            MPI_Status status;
         // MPI_Recv(res, 1, MPI_INT, i+1, i+1, MPI_COMM_WORLD, &status);
        //  number = number + res[0];
        }
        printf("\n\ntotal number of result found:%d\n", number);


    } else {
        patternPartitioning mypartition;
        MPI_Status status;
        int number[1];
        int mpi_recv_block[2];
        MPI_Recv(mpi_recv_block, 2, MPI_INT, 0, rank, MPI_COMM_WORLD,
                &status);
        printf("Processor : %d : has start : %d  : and end : %d :\n",rank,mpi_recv_block[0],mpi_recv_block[1]);

        //perform the search here

        int size = mpi_recv_block[1]-mpi_recv_block[0];
       char *text = (char*) malloc (size);
            fseek(fp,mpi_recv_block[0] , SEEK_SET);
        fread(&text, sizeof(char), size, fp);
printf("read in rank1");

     //  fread(text,size,size,fp);
       printf("length of text segment by proc: %d is %d",rank,(int)strlen(text));

         number[0] = rabincarp(text,pattern);
        //MPI_Send(number, 1, MPI_INT, 0, rank, MPI_COMM_WORLD);
    }

MPI_Barrier(MPI_COMM_WORLD);
    MPI_Finalize();
fclose(fp);
    return (EXIT_SUCCESS);
}

if I run( mpirun -np 2 pnew ) this I am getting the following error:

  [localhost:03265] *** Process received signal ***
[localhost:03265] *** Process received signal ***
--------------------------------------------------------------------------
mpirun noticed that process rank 1 with PID 3265 on node localhost exited on signal 7 (Bus error).

so if I remove the fread() statements I dont get the error.. can anyone tell me what am I missing?


char *text = (char*) malloc (size);

fseek(fp,partition->lowerOffset , SEEK_SET);
fread(&text, sizeof(char), size, fp);

The documentation for fread says "The function fread() reads nmemb elements of data, each size bytes long, from the stream pointed to by stream, storing them at the location given by ptr."

Since text is a char *, &text is the address of a char *. That won't have enough space to hold the data you're reading. You want to pass fread the address of the memory you allocated, not the address of the variable holding that address! (So remove the &.)


if (fp != '\0') {

fp is FILE* , '\0' is an int constant. This is not the error, but I suggest you compile with a higher warning level to catch this kind of errors.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号