cancel
Showing results for 
Search instead for 
Did you mean: 

Archives Discussions

the729
Journeyman III

Seg-fault on second run

Hi, all

#include <stdio.h>

kernel void increase(float a<>, out float c<>
{
    c = a+1;
}

int main(int argc, char** argv)
{
  int i, j;
  float input_a[4] = {1, 2, 3, 4};
  float c<4>;

  for(i=0; i<2; i++) {
    float a<4>;
    streamRead(a, input_a);
    increase(a, c);
    streamWrite(c, input_a);
  }

  return 0;
}

This piece of code lead to a segment fault on my system. It is OK on the first iteration, but crashes at __k->Map() on the second iteration.
However, everything is fine if I move the declaration of stream a<> outside of the loop, like this:
  .....
  float c<4>;
  float a<4>;

  for(i=0; i<2; i++) {
    ......
  }

I'm not sure if it is related to this thread:
http://forums.amd.com/devforum/messageview.cfm?catid=328&threadid=101244&enterthread=y

0 Likes
5 Replies
jean-claude
Journeyman III

Not sure but I tend to think that you already found the reason:

Having a stream declaration inside a loop simply create an stream object

any time the instruction is encountered (see generated code).

So get your stream float a<4> outside of the loop....

0 Likes

For this particular case, putting the declaration outside will indeed solve the problem.

However, this means functions doing GPU works cannot be called more then once. For instance, this also breaks:

int main()
{
  ....
  for(...) {
    process_data(....);
  }
  ....
}

void process_data(i, o)
{
  float i_stream<...>;
  float o_stream<...>;
  doing GPU computation
}

0 Likes

I think this is related to a weakness already identified and brought to

the attention of ATI: there should be an explicit statement to dispose (free) stream objects. At least one would know and understand what is going on !

 

0 Likes

In this case why don't you use your approach as you described in:

http://forums.amd.com/devforum/messageview.cfm?catid=328&threadid=100999&enterthread=y

and add the statements

i_stream.~stream();

o_stream.~stream();

at the end of process data(i,o)

 

or better: get your stream declarations

 ::brook::stream i_stream(::brook::getStreamType(( float  *)0), wx,wy,-1);

 ::brook::stream o_stream(::brook::getStreamType(( float  *)0), wx,wy,-1);

 

out of the loop

 

0 Likes

Agreed. As I wrote in another response:

Currently, streams have auto-pointer behavior -- they are de-allocated when they go out of memory. We are working towards adding dynamic allocation behavior in the next release.

float a<height,width>;

{

float b<height,width>; // intermediate working stream





streamread(a,...)

process(a,b,..)

} //b goes out of scope

streamwrite(a,...)

 

Originally posted by: jean-claude I think this is related to a weakness already identified and brought to

 

the attention of ATI: there should be an explicit statement to dispose (free) stream objects. At least one would know and understand what is going on !

 

 

 

0 Likes