MPI中的fread()给出了Signal 7 Bus Error

时间:2011-10-12 18:36:53

标签: c mpi parallel-processing openmpi

我是C和MPI的新手。 我有以下代码,我正在使用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, 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);
}

如果我跑(mpirun -np 2 pnew),我收到以下错误:

  [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).

所以,如果我删除了fread()语句,我就不会收到错误..谁能告诉我我错过了什么?

2 个答案:

答案 0 :(得分:3)

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

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

fread的文档说明“函数fread()nmemb指向的流中读取size个数据元素,每个stream个字节长,将它们存储在ptr给出的位置。“

由于textchar *&textchar *的地址。这将没有足够的空间来容纳您正在阅读的数据。您想要传递fread您分配的内存的地址,而不是传递该地址的变量的地址! (因此请删除&。)

答案 1 :(得分:0)

if (fp != '\0') {

fp是FILE *,'\ 0'是一个int常量。 这不是 错误,但我建议您使用更高的警告级别进行编译以捕获此类错误。