|
Hi,
Thanks for your interest in my problem. God bless you.
I am till getting same error messages in my redirected output file. The messages are:
[lc2530hz:03857] *** Process received signal ***
[lc2530hz:03857] Signal: Segmentation fault (11)
[lc2530hz:03857] Signal code: (128)
[lc2530hz:03857] Failing at address: (nil)
[lc2530hz:03858] *** Process received signal ***
[lc2530hz:03858] Signal: Segmentation fault (11)
[lc2530hz:03858] Signal code: (128)
[lc2530hz:03858] Failing at address: (nil)
[lc2530hz:03859] *** Process received signal ***
[lc2530hz:03859] Signal: Segmentation fault (11)
[lc2530hz:03859] Signal code: (128)
[lc2530hz:03859] Failing at address: (nil)
[lc2530hz:03857] [ 0] /lib/x86_64-linux-gnu/libc.so.6(+0x3ef20)[0x7f7c3323df20]
[lc2530hz:03857] [ 1] /lib/x86_64-linux-gnu/libc.so.6(fclose+0xd4)[0x7f7c3327d324]
[lc2530hz:03857] [ 2] ./a.out(+0x125b)[0x5581b8fa925b]
[lc2530hz:03857] [ 3] [lc2530hz:03858] [ 0] /lib/x86_64-linux-gnu/libc.so.6(+0x3ef20)[0x7fa90fa0af20]
[lc2530hz:03858] [ 1] /lib/x86_64-linux-gnu/libc.so.6(fclose+0xd4)[0x7fa90fa4a324]
[lc2530hz:03858] [ 2] ./a.out(+0x125b)[0x557a7d5c725b]
[lc2530hz:03858] [lc2530hz:03859] [ 0] /lib/x86_64-linux-gnu/libc.so.6(+0x3ef20)[0x7f157c799f20]
[lc2530hz:03859] [ 1] /lib/x86_64-linux-gnu/libc.so.6(fclose+0xd4)[0x7f157c7d9324]
[lc2530hz:03859] [ 2] ./a.out(+0x125b)[0x55dd2168325b]
[lc2530hz:03859] [ 3] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f7c33220b97]
[ 3] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f157c77cb97]
[lc2530hz:03859] [ 4] [lc2530hz:03857] [ 4] ./a.out(+0xc6a)[0x5581b8fa8c6a]
[lc2530hz:03857] *** End of error message ***
+0xe7)[0x7fa90f9edb97]
[lc2530hz:03858] [ 4] ./a.out(+0xc6a)[0x557a7d5c6c6a]
[lc2530hz:03858] *** End of error message ***
./a.out(+0xc6a)[0x55dd21682c6a]
[lc2530hz:03859] *** End of error message ***
--------------------------------------------------------------------------
mpirun noticed that process rank 3 with PID 0 on node lc2530hz exited on signal 11 (Segmentation fault).
--------------------------------------------------------------------------
My modified code is:
#include <stdio.h>
#include <math.h>
#include <mpi.h>
#include <time.h>
#include <stdlib.h>
//#include <vector.h>
//using namespace std;
// Sorts the input row into chunks to be scattered two all the processors.
void sortByProcess(/*vector<double>*/double* list1, double* list2, int count);
// Swaps two rows.
void swap(double** list, int count, int row1, int row2);
int rank, size;
int main(int argc, char * argv[])
{
double sTime, eTime, rTime;
/*ifstream*/ FILE* inFile;
int num_rows = 3200;
int num_cols = 3200;
int cur_control = 0;
double * send_buffer = NULL;
double * recv_buffer = NULL;
double ** data = NULL;
double determinant;
char strNum_rows[20];
/*vector<double>*/double* file_buffer=NULL;
// Just get the initialization of the program going.
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
// If the input file is not given, print message and exit.
if(argc < 2)
{
/*cout <<*/ printf("No input file given.\n");// << endl;
MPI_Finalize();
return 0;
}
// If the root node (0), then open the input file and read in the
// number of rows.
if(!rank)
{
printf("After rank inside if @@@@@");
inFile = fopen(argv[1], "r");
fgets(strNum_rows, 20, inFile);
num_rows = atoi(strNum_rows);
printf("num_rows???? =%d",num_rows);
file_buffer = (double *) malloc(num_rows * sizeof(double ));//1
if(file_buffer == NULL) {
printf("malloc can't allocate memory for file_buffer");
MPI_Finalize();
return -1;
}
/*???? inFile.open(argv[1]);
inFile >> num_rows;
file_buffer.resize(num_rows);*/
}
//printf("After rank outside @@@@@@@@#");
send_buffer = (double *)malloc(num_rows * sizeof(double ));
if(send_buffer == NULL) {
printf("malloc can't allocate memory for send_buffer");
MPI_Finalize();
return -1;
}
/*?????send_buffer = new double[num_rows];*/
//printf("After send_buffer #####@");
// Broadcasts the number of rows to each processor.
MPI_Bcast (&num_rows, 1, MPI_INT, 0, MPI_COMM_WORLD);
num_cols = num_rows / size;
// Allocate the memory on each processor.
//printf("After Bcast #####@");
//data = (double **) malloc(num_cols * sizeof(double *));
//calloc initializes the allocated memory to zero
data = (double **)calloc(num_rows, sizeof(double*));
if(data == NULL) {
printf("malloc can't allocate memory for data");
MPI_Finalize();
return -1;
}
/*???? data #####@");*/
for(int i = 0; i < num_cols; i++){
data[i] = (double *) malloc(num_rows * sizeof(double ));
if(data[i] == NULL) {
printf("data[%d] = malloc(%lu)", i, num_rows * sizeof(double));
printf("malloc can't allocate memory for data[%d]", i);
//
if(i>0) {
for(int j = i-1; j>=0; j--)
free( data[j]);
free(data);
MPI_Finalize();
return -2;
}
}
}
/* ??? data[i] = new double[num_rows]; */
for(int i = 0; i < num_cols; i++)
{
for(int j = 0; j < num_rows; j++)
data[i][j] = 0;
}
//printf("Before recv_buffer $$$$$$$@");
recv_buffer = (double *) malloc(num_cols * sizeof(double *));
if(recv_buffer == NULL) {
printf("malloc can't allocate memory for recv_buffer");
MPI_Finalize();
return -1;
}
/*???? recv_buffer = new double[num_cols];*/
// Scatter the data.
for(int i = 0; i < num_rows; i++)
{
if(!rank)
{
for(int j = 0; j < num_rows; j++){
fgets(strNum_rows, 20, inFile);
file_buffer[j] = atof(strNum_rows);
}
/*????? inFile >> file_buffer[j];*/
sortByProcess(file_buffer, send_buffer, num_rows);
}
//printf("After sortByProcess ^^^^^^@");
// Scatters the data so that each process gets the next value for their columns.
MPI_Scatter(send_buffer, num_cols/* NOTE num_rows gives SCATTER ERROR &deviates from original code */, MPI_DOUBLE, recv_buffer, num_cols, MPI_DOUBLE, 0, MPI_COMM_WORLD );
for(int j = 0; j < num_cols; j++)
{
data[j][i] = recv_buffer[j];
}
}
//printf("After Scatter ^^^^^^@");
fclose(inFile);
/*delete []*/ free(recv_buffer);
/*delete []*/ free(send_buffer);
//free(file_buffer);
/*delete []*/ //free(send_buffer);
for(int i = 0; i < num_cols; i++)
/*delete []*/ free( data[i]);
/*delete []*/ free(data);
// Begin timing.
MPI_Barrier(MPI_COMM_WORLD);
sTime = MPI_Wtime();
printf("After Barrier ^^^^^^@");
MPI_Finalize();
return 0;
My compilation and execution statements are:
$mpicc gaussian.c
$mpirun -np 4 ./a.out matrix.3200.txt>output
Some body please guide me.
Zulfi.
|
|
|
|
|
Hi friends,
This problem got solved.
Thanks for your efforts. God bless you guys.
Solution is:
if (!rank)
fclose(inFile);
Zulfi.
|
|
|
|
|
Good to here.
But you need to fix this
recv_buffer = (double *) malloc(num_cols * sizeof(double *)); it should be
recv_buffer = (double *) malloc(num_cols * sizeof(double));
INTP
"Program testing can be used to show the presence of bugs, but never to show their absence." - Edsger Dijkstra
"I have never been lost, but I will admit to being confused for several weeks. " - Daniel Boone
|
|
|
|
|
Hi,
Thanks for your good intentions and for correcting my code through defensive programming techniques.
I was missing you. I am not getting correct results. C++ code is giving correct results. I would take up this problem again but I have to complete the assigned task first.
Wish you all the best.
Zulfi.
|
|
|
|
|
Hi,
I have following C++ code:
double ** data = NULL;
data = new double*[num_cols];for(int i = 0; i < num_cols; i++)
data[i] = new double[num_rows];
I have converted them into following C-language code:
double ** data = NULL;
data = (double *) malloc(num_cols * sizeof(double));
for(int i = 0; i < num_cols; i++)
data[i] = (double *) malloc(num_rows * sizeof(double));
I am getting following error message with gcc:
Quote: In function ‘main’:
gaussian.c:73:8: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
data = (double *) malloc(num_cols * sizeof(double));
Some body please guide me.
Zulfi.
|
|
|
|
|
zak100 wrote:
double ** data = NULL;
data = (double *) malloc(num_cols * sizeof(double));
for(int i = 0; i < num_cols; i++)
data[i] = (double *) malloc(num_rows * sizeof(double));
Shouldn't it be
data = (double *) malloc(num_cols * sizeof(double*));
|
|
|
|
|
It should ... it's a standard dynamic 2D array of double in C.
The code as written is stupid for C++ it's clearly a matrix and there are a dozen better ways to do that.
You can also just flatten it in C to a linear 1D allocation if you are happy to manually do the indexing.
In vino veritas
modified 25-Apr-19 8:24am.
|
|
|
|
|
Victor Nijegorodov wrote: Shouldn't it be
data = (double *) malloc(num_cols * sizeof(double*));
I think that should be
data = (double **)malloc(num_cols * sizeof(double *));
The warning he is getting is about an incompatible pointer assignment. For myself I'd write that as
data = (double **)malloc(num_cols * sizeof *data); Since C doesn't require malloc() to be cast, you could omit the cast to (double **) when calling malloc() .
|
|
|
|
|
Looking at this, and your other post prompts the obvious question: why are you trying to convert working code from C++ to C? Since all modern compilers support C++ it would be better to stick with what works.
|
|
|
|
|
That is a rash statement in the embedded space there is rarely a C++ compiler.
Then the second kicker few in the industry would accept C++ code because of the notorious problems with memory on a confined system.
Definitely not a problem on the PC market but you can't make that sweeping statement.
In vino veritas
|
|
|
|
|
|
Thanks. I want to do some work instead of using the cooked code. Also it would provide me two versions so I can test both and find which one is better.
Zulfi.
|
|
|
|
|
I've yet to work on an embedded project where there wasn't a C++ computer. (Even in the late 90s, I was using C++ in the embedded space. Yes, it was mostly procedural C++, but it was still C++.)
|
|
|
|
|
|
leon de boer wrote: Lets list the ones I know that don't have a c++ compiler
Whereupon only one doesn't have a C++ compiler.
|
|
|
|
|
Hi,
I am still getting the same message:
Quote: $ mpicc gaussian.c
gaussian.c: In function ‘main’:
gaussian.c:73:8: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
data = (double *) malloc(num_cols * sizeof(double *));
^
$
I forget my C++ so I want to do this conversion.
Some body please guide me.
Zulfi.
|
|
|
|
|
Hi,
I have solved this problem:
The solution is:
data = (double **) malloc(num_cols * sizeof(double **));
/*???? data = new double*[num_cols];*/
for(int i = 0; i < num_cols; i++)
data[i] = (double *) malloc(num_rows * sizeof(double));
|
|
|
|
|
That isn't correct but you are getting away with it because the pointer size is standard double* and double** are the same size.
If you are handing this in for a uni assignment they will ping you for it.
Lets put the comments over it so you get it
data = (double **) malloc(num_cols * sizeof(double *));
for(int i = 0; i < num_cols; i++)
data[i] = (double *) malloc(num_rows * sizeof(double));
So you end up using more space this way because you have the actual array data (column x row) plus row number of pointers.
If you flat 1D the array you can just allocate
double* data1D = (double*) malloc(num_rows * num_cols * sizeof(double));
It is smaller but you can't just reference it via
data[i][j] you have to reference if via a formula
data1D[j*num_cols + i]
So there is a trade off being made between memory size and ease of indexing.
The flat 1D array is usually faster if you know you pointer arithmetic but more prone to beginner error.
It's clearly a M x N matrix and most commercial programmers would flatten it to a 1D array because you are likely going to do matrix arithmetic and there are tricks you can use with a flat 1D array and memmove.
In vino veritas
modified 25-Apr-19 14:22pm.
|
|
|
|
|
Hi my friends,
t t
Thanks for your help.
Its really a good idea to have faster application and for last 2 assignments, just because of this fact that the grader has to wait a lot to see my results, I am not a good scorer.
However at this point, I dont know the trick to do it. So I am interested in a C language working solution and I am close to it. Once I am done I have to focus on performance.
Thanks for your good intentions. But I would really do it. I have one more part left after this one.
Zulfi.
|
|
|
|
|
I guess this won't be the reply you expect or want, but …
In the early 1980s, when the C++ language was first being developed at Bell Labs, the first (and for a long time the only) "compiler" for C++ was a tool called cfront . It converted C++ source code into valid C source code (for which there were already a gazillion compilers, of course) The cfront compiler was actually maintained for over a decade, ending with the release of version 3.0.3 (the last official version of which I am aware) in May 1994.
Your current project (as I understand it), is to convert some existing C++ source code (that allegedly works correctly) into C source code (presumably also with the works correctly option). I suspect the ultimate target is a platform for which no C++ compiler is available.
If the original C++ source that you are porting does NOT make extensive use of some of the more modern additions to the language, then you might consider running cfront on the original C++ source. I am not suggesting that it should replace your manual porting efforts to date, but to act merely as your assistant in a purely advisory capacity.
The last version of cfront was released around the time that the C++ language added templates (which are implemented) and exceptions (which are not implemented). If you are interested, you can download cfront or browse the source code courtesy of the Software Preservation Group (which is part of the Computer History Museum in Mountain View, California (Silicon Valley).
You can either download cfront version 3.0.3 from May 1994 (as a gzip'd tar archive), or as an alternative if you prefer, you can browse the source tree (in a new browser window).
|
|
|
|
|
ChrisFromWales wrote: The last version of cfront was released around the time that the C++ language added templates
[...]
cfront version 3.0.3 from May 1994 [...]
This can't be right. I remember programming templates around ~1988 when I was at university, working with PHIGS[^] . cfront did require multiple passes to correctly translate some templates, and was restricted more than the language specification would allow in theory. But for the most part it could handle templates back then.
Since there was no C++ standard in existence, it's hard to say at what time, exactly, cfront supported templates fully though: it led a catch-up races with the C++ designers who kept introducing new features.
GOTOs are a bit like wire coat hangers: they tend to breed in the darkness, such that where there once were few, eventually there are many, and the program's architecture collapses beneath them. (Fran Poretto)
|
|
|
|
|
Hi!
I am having difficulty processing the following problem.
modified 25-Apr-19 3:55am.
|
|
|
|
|
In what part exactly (1, 2a, 2b, 2c, 3) do you have "difficulty"?
What are the types of "difficulty"?
|
|
|
|
|
Quote: The purpose of this Task is to let you express your problem-solving skills, programing skills, as well as to reveal your style of coding. The question is clear, it is to test your skills, not the skills of some strangers on the internet. Show what you have tried, explain what you are having a problem with, and people will try to help you. But no one is going to do your work for you.
|
|
|
|
|
Hi,
I want to convert the following C++ code into C-language.
For the following code,
<pre> ifstream inFile;
inFile >> num_rows;
file_buffer.resize(num_rows);
I wrote:
FILE* inFile;
inFile = fopen(argv[1], "r");
fgets(strNum_rows, 20, inFile);
num_rows = atoi(strNum_rows);
But I can't understand how to declare file_buffer and how to convert :
vector<double> file_buffer;
file_buffer.resize(num_rows);
in 'C' language?
Somebody please guide me.
Zulfi.
|
|
|
|