C Поиск массива MPI (ошибка сегментации MPI_Scatter)

Мой код MPI продолжает работать с ошибкой сегментации для всех задач, не являющихся главными.

#include "mpi.h"
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[]) {
    int list_size = 1000
    int threads;
    int th_nums;
    int slice;
    int index;
    char* the_array[list_size];
    char* temp_array[list_size];
    char str_to_search[10];

    FILE *in = fopen("inputfile", "r");

    char parse[10];

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &threads);
    MPI_Comm_size(MPI_COMM_WORLD, &th_nums);

    if (threads == 0) { // if master task
        fgets(parse, 10, in);
        slice = atoi(parse); // How many slices to cut the array into

        fgets(parse, 10, in);
        sscanf(parse, "%s", search); // gives us the string we want to search

        int i;
        for (i = 0; i < list_size; i++) {
            char temp[10];
            fgets(parse, 10, in);
            sscanf(parse, "%s", temp);
            the_array[i] = strdup(temp);
        }
        index = list_size/slice; // 
        MPI_Bcast(&str_to_search, 10, MPI_CHAR, 0, MPI_COMM_WORLD);
        MPI_Bcast(&index, 15, MPI_INT, 0, MPI_COMM_WORLD);
    }

    MPI_Bcast(&str_to_search, 10, MPI_CHAR, 0, MPI_COMM_WORLD);
    MPI_Bcast(&index, 15, MPI_INT, 0, MPI_COMM_WORLD);

    MPI_Scatter(the_array, index, MPI_CHAR, temp_array, index, 0, MPI_COMM_WORLD);

    // TESTING IF THE TEMP_ARRAY RECEIVED DATA
    printf("Thread %i's temp_array[0] is %s\n", threads, temp_array[0]);

    // Search for string occurs here

    MPI_Finalize();

    return 0;
}

Ошибка, которую я получаю, такова:

  [katya-kazanova:03096] *** Process received signal ***
  [katya-kazanova:03096] Signal: Segmentation fault (11)
  [katya-kazanova:03096] Signal code: Address not mapped (1)
  [katya-kazanova:03096] Failing at address: 0x220e6d0
  [katya-kazanova:03096] [ 0] /lib64/libpthread.so.0() [0x359fc0f710]
  [katya-kazanova:03096] [ 1] /lib64/libc.so.6(_IO_vfprintf+0x3e5c) [0x359f047e2c]
  [katya-kazanova:03096] [ 2] /lib64/libc.so.6(_IO_printf+0x9a) [0x359f04f18a]
  [katya-kazanova:03096] [ 3] ./test(main+0x31b) [0x400eaf]
  [katya-kazanova:03096] [ 4] /lib64/libc.so.6(__libc_start_main+0xfd) [0x359f01ed5d]
  [katya-kazanova:03096] [ 5] ./test() [0x400ad9]
  [katya-kazanova:03096] *** End of error message ***
  [katya-kazanova:03097] *** Process received signal ***
  [katya-kazanova:03098] *** Process received signal ***
  [katya-kazanova:03098] Signal: Segmentation fault (11)
  [katya-kazanova:03098] Signal code: Address not mapped (1)
  [katya-kazanova:03098] Failing at address: 0x223f410
  [katya-kazanova:03098] [ 0] /lib64/libpthread.so.0() [0x359fc0f710]
  [katya-kazanova:03097] Signal: Segmentation fault (11)
  [katya-kazanova:03097] Signal code: Address not mapped (1)
  [katya-kazanova:03097] Failing at address: 0x2226d70
  [katya-kazanova:03098] [ 1] /lib64/libc.so.6(_IO_vfprintf+0x3e5c) [0x359f047e2c]
  [katya-kazanova:03098] [ 2] /lib64/libc.so.6(_IO_printf+0x9a) [0x359f04f18a]
  [katya-kazanova:03098] [ 3] ./test(main+0x31b) [0x400eaf]
  [katya-kazanova:03098] [ 4] /lib64/libc.so.6(__libc_start_main+0xfd) [0x359f01ed5d]
  [katya-kazanova:03098] [ 5] ./test() [0x400ad9]
  [katya-kazanova:03098] *** End of error message ***
  [katya-kazanova:03097] [ 0] /lib64/libpthread.so.0() [0x359fc0f710]
  [katya-kazanova:03097] [ 1] /lib64/libc.so.6(_IO_vfprintf+0x3e5c) [0x359f047e2c]
  [katya-kazanova:03097] [ 2] /lib64/libc.so.6(_IO_printf+0x9a) [0x359f04f18a]
  [katya-kazanova:03097] [ 3] ./test(main+0x31b) [0x400eaf]
  [katya-kazanova:03097] [ 4] /lib64/libc.so.6(__libc_start_main+0xfd) [0x359f01ed5d]
  [katya-kazanova:03097] [ 5] ./test() [0x400ad9]
  [katya-kazanova:03097] *** End of error message ***

И я всегда получаю

Thread 0's temp_array[0] is aaa

Что верно для потока 0.

Я предполагаю, что это происходит потому, что только основная задача получает часть среза, а другие задачи ничего не получают.


person casualresearcher    schedule 06.05.2015    source источник
comment
Чтобы сказать вам, что конкретно не так, нам потребуется получить пример ввода, но на первый взгляд, ранг 0 будет делать на два вызова MPI_Bcast больше, чем все остальные (два в своем конкретном блоке плюс два под ним).   -  person Wesley Bland    schedule 06.05.2015
comment
Это обсуждалось здесь бесчисленное количество раз: MPI не поддерживает массив указателей. Вы должны объединить память в один непрерывный блок.   -  person Hristo Iliev    schedule 07.05.2015
comment
возможный дубликат MPI_Scatter - не работает должным образом   -  person Hristo Iliev    schedule 07.05.2015
comment
Интересно, спасибо, теперь я вижу, что проблема, скорее всего, связана с проблемой двумерного массива. Но как мне сгладить этот массив? Я вижу в ссылке, которую вы разместили, как они сделали это с целыми числами, но поскольку я работаю с char*, я бы не стал сглаживать массив двумерных символов, который содержит array[0] = 'hi', array[1] = «привет», массив [2] = «до свидания» в «привет, до свидания»?   -  person casualresearcher    schedule 07.05.2015
comment
Строки можно легко объединить, разделив их символами NUL (\0). Также следует использовать MPI_Scatterv, потому что куски, скорее всего, будут разного размера. Другим вариантом было бы, чтобы каждая строка занимала одинаковое количество места, например. 64 байта, дополненные NUL.   -  person Hristo Iliev    schedule 07.05.2015
comment
MPI_Bcast() и большинству функций MPI требуется указатель на отправляемые данные. При записи MPI_Bcast(&str_to_search, 10, MPI_CHAR, 0, MPI_COMM_WORLD); указатель на массив символов передается MPI_Bcast(). Но это должен быть указатель на первый элемент массива. Итак, MPI_Bcast(str_to_search, 10, MPI_CHAR, 0, MPI_COMM_WORLD);   -  person francis    schedule 07.05.2015