ciembor
ciembor

Reputation: 7337

UPC allocating dynamic array and sorting

I try to read floats from a file and then sort them. Sort must be paralell UPC. That's current code:

#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;
}

And I don't know what am I doing wrong. I get segmentation fault, becouse allocation of memory goes wrong. Can you help me?

Upvotes: 0

Views: 404

Answers (1)

ouah
ouah

Reputation: 145899

This call is wrong:

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

Also your object array is a pointer to float. It is normal sizeof array will return the size of the pointer type (8 in your implementation) and not the size of the array object you allocated. You should check the return value of upc_all_alloc to verify there was no error during allocation (if the return value == NULL, the allocation failed).

Upvotes: 1

Related Questions