challengerTA
challengerTA

Reputation: 65

What is causing my code to be non-deterministic?

I might've gone crazy here, but I keep recompiling the exact same code, and get different answers. I'm not using any random values at all. I am strictly staying to floats and 1D arrays (I want to port this to CUDA eventually).

Is it possible on the compiler side that my same code is being redone in a way that makes it not work at all?

I run the .exe by just clicking on it and it runs fine, but when I click "compile and run" (Dev C++ 4.9.9.2) none of my images come out right. ...although sometimes they do.

...any insight on how I fix this? If I can provide any more help please tell me.

Much Appreciated.

Edit: Here's the block of code that if I comment it out, everything runs sort of right. (Its completely deterministic if I comment this block out) -this is a electromagnetic simulator, if that helps at all:

        //***********************************************************************
    //     Update HZ in PML regions (hzx,hzy)
    //***********************************************************************

    boundaryIndex = 0;
    for (regionIndex = 1; regionIndex < NUMBEROFREGIONS; regionIndex++) {
        xStart = regionData[regionIndex].xStart;
        xStop  = regionData[regionIndex].xStop ;
        yStart = regionData[regionIndex].yStart;
        yStop  = regionData[regionIndex].yStop ;
        for (i = xStart; i < xStop; i++) {
            for (j = yStart; j < yStop; j++) {
                hzx = hz[i*xSize+j] - hzy[boundaryIndex];   // extract hzx
                hzx = dahz[i*xSize+j] * hzx + dbhz[i*xSize+j] * ( ey[i*(xSize+1)+j] - ey[(i+1)*(xSize+1)+j] );    // dahz,dbhz holds dahzx,dbhzx
                hzy[boundaryIndex] = dahzy[boundaryIndex] * hzy[boundaryIndex] + dbhzy[boundaryIndex] * ( ex[i*ySize+j+1] - ex[i*ySize+j] );
                hz[i*xSize+j] = hzx +  hzy[boundaryIndex];  // update hz
                boundaryIndex++;
            }  //jForLoop /
        }  //iForLoop /
    }  //

where, NUMBEROFREGIONS is constant (8), Xsize is defined at compile time (128 here).

Upvotes: 2

Views: 1591

Answers (5)

James Anderson
James Anderson

Reputation: 27478

Well some code examples would help! But this is a classic symptom of un-initialized variables.

You are not setting some important variables (indexes to 0, switches to True etc.) so your program picks up whichever values are hanging around in memory each time you run. As these are effectively random values you get different results each time.

Upvotes: 5

Jason Rogers
Jason Rogers

Reputation: 19344

As everybody said without some code of what is wrong we can't help you a lot.

My best gest from what you just explained is that your creating pointers on non allocated memory.

something like this

APointer *aFunction(){
   YourData yd = something;//local variable creation
   return yd;
}

main(){

APointer *p = aFunction();

}

Here p is a pointer to something that was a local varaible in aFunction and got destroyed as soon as it left the function, this will sometime by PURE LUCK still point to the right data that hasn't been written over, but this memory space will eventual be changed and your pointer will be reading something different completly random.

Upvotes: 1

dreamlax
dreamlax

Reputation: 95355

You are potentially invoking undefined behaviour. There are a number of things that are undefined by the C language standard. Some of these cases can be caught by the compiler and you may be issued a diagnostic, others are harder for the compiler to catch. Here is just a few things that have undefined behaviour:

  1. Trying to use the value of an uninitialised variable:

    int i;
    printf("%d\n", i); // could be anything!
    
  2. An object is modified more than once between sequence points:

    int i = 4;
    i = (i += ++i); // Woah, Nelly!
    
  3. Reading or writing past the end of an allocated memory block:

    int *ints = malloc(100 * sizeof (int));
    ints[200] = 0; // Oops...
    
  4. Using printf et. al but providing the wrong format specifiers:

    int i = 4;
    printf("%llu\n", i);
    
  5. Converting a value to a signed integer type but the type cannot represent the value (some say this is implementation defined and the C language specification seems ambiguous):

    signed short i;
    i = 100.0 * 100.0 * 100.0 * 100.0; // probably won't fit
    

Edit:

Answered before OP provided code.

Upvotes: 2

Peter R
Peter R

Reputation: 41

Is there an indexing error with your simulated two-dimensional array? Is ey supposed to be xSize or xSize+1 wide?

   dahz[i*xSize+j] * hzx +
   dbhz[i*xSize+j] * ( ey[i*(xSize+1)+j] - 
   ey[(i+1)*(xSize+1)+j] ); 

Your index treats 2D array ey as being xSize+1 wide. The code for array ex treats it as being ySize wide.

 dbhzy[boundaryIndex] * ( ex[i*ySize+j+1] - ex[i*ySize+j] );

Upvotes: 4

Chad
Chad

Reputation: 3018

Are you compiling it in debug mode or release mode? Each one of these have different way how they initialize the heap and memory.

Upvotes: 1

Related Questions