UPC, выделяющий динамический массив и сортирующий

Я пытаюсь читать поплавки из файла, а затем сортировать их. Сортировка должна быть параллельной UPC. Это текущий код:

#include <upc_relaxed.h>
#include <upc_collective.h>
#include <stdio.h>
#include <stdlib.h>

int lt_int( shared void *x, shared void *y ) {
  int x_val = *(shared int *)x, 
    y_val = *(shared int *)y;
  return x_val > y_val ? -1 : x_val < y_val ? 1 : 0;
}

shared int size=0;

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


  FILE *f;
  int i=0;
  if (MYTHREAD == 0) {
    f = fopen ("dane.dat", "r");
    while (feof(f) == 0) {        
      fscanf (f, "%f\n");                
      ++size;    
    }
    fclose(f);
  }

  upc_barrier;

  /* allocation goes wrong! */
  shared [] float *array = upc_all_alloc(size, sizeof(float));
  /* printf("%d\n",sizeof(array)); // it returns 8! */ 

  upc_barrier;

  if (MYTHREAD == 0) {
    f = fopen ("dane.dat", "r");
    i=0;   
    while (feof(f) == 0) {
      printf("%d\n", i);
      /* segmentation fault! */
      fscanf (f, "%f\n", &array[i]);    
      printf("%f\n", array[i]);            
      i++;    
    }
    fclose(f);
  }

  upc_barrier;
  upc_all_sort( array, sizeof(float), size/THREADS, size, lt_int, UPC_IN_ALLSYNC);
  upc_barrier;  

  if (MYTHREAD == 0) {
    for (i = 0; i<=atoi(argv[1]) ; ++i) {
      printf("%f\n", array[atoi(argv[1]) + (size/atoi(argv[1]))]);
    }
  }

  return 0;
}

И я не знаю, что я делаю неправильно. Я получаю ошибку сегментации, потому что выделение памяти происходит неправильно. Вы можете помочь мне?


person ciembor    schedule 27.01.2012    source источник
comment
Вам нужно выделить более одного пространства с плавающей запятой, не так ли? Почему бы вам не попробовать вместо этого выделить sizeof(float)*THREADS байт.   -  person Borealid    schedule 27.01.2012
comment
Я пытался (я пробовал много вещей). sizeof(array) снова возвращает 8, и снова ошибка сегментации :(.   -  person ciembor    schedule 27.01.2012


Ответы (1)


Этот вызов неверен:

fscanf (f, "%f\n");

Также ваш объект array является указателем на float. Обычно sizeof array возвращает размер типа указателя (8 в вашей реализации), а не размер выделенного вами объекта массива. Вы должны проверить возвращаемое значение upc_all_alloc, чтобы убедиться, что во время выделения не было ошибки (если возвращаемое значение == NULL, выделение не удалось).

person ouah    schedule 27.01.2012
comment
Спасибо за предложения, теперь я ищу способ подсчитать количество поплавков в моем файле... Я обнаружил, что получаю 8 + (10 * число строк)... - person ciembor; 27.01.2012