fbcyborg
25-03-2011, 11:51
Salve a tutti,
so dov'è il problema nel codice che segue, ma non riesco a correggerlo.
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char* argv[]){
int i,j=0;
int multiplication = 0;
int n_cpu = 8;
int ops_per_thread = 16;
int **intervals;
int num_blocks = 1024;
intervals = (int**)malloc( n_cpu * sizeof(int) );
for(i=0; i<n_cpu; i++)
intervals[i] = (int*)malloc( 2 * sizeof(int) );
for(i=0;i<n_cpu;i++){
multiplication = ops_per_thread*i;
intervals[i][0] = multiplication;
if(i==n_cpu-1){// The last thread gets also the remaining
multiplication = ops_per_thread*(i+1)-1;
intervals[i][1] = multiplication + (num_blocks % n_cpu);
}else{
multiplication = ops_per_thread*(i+1)-1;
intervals[i][1] = multiplication;
}
}
printf("The matrix is:\n");
for (i = 0; i < n_cpu; i++) {
for (j = 0; j < 2; j++)
printf("%6d ", intervals[i][j]);
printf("\n");
}
return 1;
}
Questo semplicissimo programma ha come obiettivo quello di stampare una matrice 8x2 con una serie di valori, che sono i seguenti:
The matrix is:
0 15
16 31
32 47
48 63
64 79
80 95
96 111
112 127
Ho scoperto che se nel ciclo for, sostituisco n_cpu con "6", la matrice viene stampata ma senza le ultime due righe. In caso contrario, va in segmentation fault non appena tenta di scrivere la settima riga.
Deduco quindi che sia un problema di scrittura in memoria non allocata, ma non capisco perché. Eppure fin'ora ho sempre allocato le matrici in questo modo. Perché (se è così) le ultime due righe non vengono allocate? :muro: :muro:
Eppure il ciclo di allocazione iniziale, arriva fino a 7. Se ci fosse qualche errore in allocazione dovrebbe uscire fuori, o sbaglio?
so dov'è il problema nel codice che segue, ma non riesco a correggerlo.
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char* argv[]){
int i,j=0;
int multiplication = 0;
int n_cpu = 8;
int ops_per_thread = 16;
int **intervals;
int num_blocks = 1024;
intervals = (int**)malloc( n_cpu * sizeof(int) );
for(i=0; i<n_cpu; i++)
intervals[i] = (int*)malloc( 2 * sizeof(int) );
for(i=0;i<n_cpu;i++){
multiplication = ops_per_thread*i;
intervals[i][0] = multiplication;
if(i==n_cpu-1){// The last thread gets also the remaining
multiplication = ops_per_thread*(i+1)-1;
intervals[i][1] = multiplication + (num_blocks % n_cpu);
}else{
multiplication = ops_per_thread*(i+1)-1;
intervals[i][1] = multiplication;
}
}
printf("The matrix is:\n");
for (i = 0; i < n_cpu; i++) {
for (j = 0; j < 2; j++)
printf("%6d ", intervals[i][j]);
printf("\n");
}
return 1;
}
Questo semplicissimo programma ha come obiettivo quello di stampare una matrice 8x2 con una serie di valori, che sono i seguenti:
The matrix is:
0 15
16 31
32 47
48 63
64 79
80 95
96 111
112 127
Ho scoperto che se nel ciclo for, sostituisco n_cpu con "6", la matrice viene stampata ma senza le ultime due righe. In caso contrario, va in segmentation fault non appena tenta di scrivere la settima riga.
Deduco quindi che sia un problema di scrittura in memoria non allocata, ma non capisco perché. Eppure fin'ora ho sempre allocato le matrici in questo modo. Perché (se è così) le ultime due righe non vengono allocate? :muro: :muro:
Eppure il ciclo di allocazione iniziale, arriva fino a 7. Se ci fosse qualche errore in allocazione dovrebbe uscire fuori, o sbaglio?