我是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()语句,就不会得到错误。。有人能告诉我我缺了什么吗?

最佳答案

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

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

fread的文档说明“函数从fread()指向的流中读取nmemb个字节长的数据元素,并将它们存储在size指定的位置。”
因为stream是aptrtext是achar *的地址。这将没有足够的空间来保存你正在读取的数据。您要传递&text您分配的内存的地址,而不是保存该地址的变量的地址!(因此删除char *

关于c - MPI中的fread()给出信号7总线错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7744824/

10-12 23:26