Text archives Help
- From: boulos@sci.utah.edu
- To: manta@sci.utah.edu
- Subject: [MANTA] r1521 - in trunk: Core/Math Core/Util Engine/ImageTraversers
- Date: Fri, 20 Jul 2007 15:48:52 -0600 (MDT)
Author: boulos
Date: Fri Jul 20 15:48:52 2007
New Revision: 1521
Modified:
trunk/Core/Math/CheapRNG.h
trunk/Core/Util/PriorityQueue.h
trunk/Engine/ImageTraversers/DeadlineImageTraverser.cc
trunk/Engine/ImageTraversers/DeadlineImageTraverser.h
Log:
Core/Math/CheapRNG.h
Making the SIMD version used again (forgot to add RayPacket
apparently, so the virtual function wasn't being overridden.
Core/Util/PriorityQueue.h
Trying to make the compiler produce a conditional move (right now it
has a jump on my system... how annoying) for this expensive portion
of the PriorityQueue code.
Engine/ImageTraversers/DeadlineImageTraverser.cc
Engine/ImageTraversers/DeadlineImageTraverser.h
Removing the statically allocated Tile* tiles array and any
reference to it. Right now there are calls to new and delete to
create Tiles when needed but this will soon be replaced with a set
of MemoryPools.
Modified: trunk/Core/Math/CheapRNG.h
==============================================================================
--- trunk/Core/Math/CheapRNG.h (original)
+++ trunk/Core/Math/CheapRNG.h Fri Jul 20 15:48:52 2007
@@ -100,7 +100,7 @@
return val;
}
- virtual void nextIntPacket(Packet<unsigned int>& results) {
+ virtual void nextIntPacket(Packet<unsigned int>& results, RayPacket&
rays) {
#ifdef MANTA_SSE
for (int i = 0; i < Packet<unsigned int>::MaxSize; i+=4) {
val_sse = _mm_add_epi32(_mm_set_epi32(2531011, 10395331, 13737667,
1),
Modified: trunk/Core/Util/PriorityQueue.h
==============================================================================
--- trunk/Core/Util/PriorityQueue.h (original)
+++ trunk/Core/Util/PriorityQueue.h Fri Jul 20 15:48:52 2007
@@ -70,11 +70,15 @@
while((p<<1)+2 < qsize){
size_t c1 = (p<<1)+1;
size_t c2 = (p<<1)+2;
+#if 0
size_t c;
if(queue_data[c1].priority > queue_data[c2].priority)
c = c1;
else
c = c2;
+#else
+ size_t c = (queue_data[c1].priority > queue_data[c2].priority) ? c1
: c2;
+#endif
queue_data[p] = queue_data[c];
p = c;
}
Modified: trunk/Engine/ImageTraversers/DeadlineImageTraverser.cc
==============================================================================
--- trunk/Engine/ImageTraversers/DeadlineImageTraverser.cc (original)
+++ trunk/Engine/ImageTraversers/DeadlineImageTraverser.cc Fri Jul 20
15:48:52 2007
@@ -64,7 +64,7 @@
}
DeadlineImageTraverser::DeadlineImageTraverser(const vector<string>& args)
- : qlock("DeadlineImageTraverser queue lock"), queue(8, 8)
+ : qlock("DeadlineImageTraverser queue lock"), queue(16, 16)
{
finished_coarse = false;
reset_every_frame = false;
@@ -115,13 +115,8 @@
}
}
frameTime = 1./frameRate;
- tiles = 0;
- total_tiles = 0;
singleSampler = new SingleSampler(vector<string>());
- //cerr << "xpacketsize = " << xpacketsize << endl;
- //cerr << "ypacketsize = " << ypacketsize << endl;
-
jitterSamplers = new JitterSampler*[kNumJitterLevels];
int num_spp = 4;
for (int i = 0; i < kNumJitterLevels; i++) {
@@ -148,12 +143,8 @@
}
context.loadBalancer->setupBegin(context, numChannels);
context.pixelSampler->setupBegin(context, numChannels);
- if(total_tiles){
- delete[] tiles;
- queue.clear();
- }
- total_tiles = 0;
- top_tiles = 0;
+
+ queue.clear();
context.rtrt_int->addIdleMode(this);
}
@@ -208,41 +199,6 @@
// Continue setting up the rendering stack.
context.pixelSampler->setupDisplayChannel(context);
- int cur = 1;
- int ntotal = 0;
- float x = xcoarsepixelsize;
- float y = ycoarsepixelsize;
- // NOTE(boulos): This used to be > 1, but needs to be >= to account
- // for (current) lowest level of a single tile of 1 pixel. In the
- // future this should get updated with something that accounts for
- // super sampling too.
- const float min_x = 1./16.f;
- const float min_y = 1./16.f;
- while(x >= min_x || y >= min_y){
- //cerr << "Cur is " << cur;
- //cerr << " x is " << x;
- //cerr << " y is " << y;
- //cerr << " ntotal is " << ntotal << endl;
- ntotal += cur;
- cur *= xrefinementRatio * yrefinementRatio;
- x /= xrefinementRatio;
- y /= yrefinementRatio;
- }
- // NOTE(boulos): But the "popTiles" code doesn't check for whether
- // or not it'll actually be generating new children, so it needs on more
- // level of available refinement space. We account for that here.
- ntotal += cur;
- if(total_tiles){
- delete[] tiles;
- queue.clear();
- }
- if(numAssignments > top_tiles)
- top_tiles = numAssignments;
- total_tiles = ntotal * xtiles * ytiles;
- //cerr << "Total tiles is now " << total_tiles << endl;
- tiles = new Tile[total_tiles];
- //queue.reserve(total_tiles); // With the new queue, we don't even need to
reserve ;)
-
singleSampler->setupDisplayChannel(context);
// NOTE(boulos): Having the sampler tell the renderer to setup is a
// bit confusing and redundant but oh well...
@@ -264,14 +220,12 @@
if (!finished_coarse) {
context.loadBalancer->setupFrame(context);
queue.clear();
- next_tile = top_tiles;
converged = false;
StartFrameTime = CPUTime::currentSeconds();
}
context.pixelSampler->setupFrame(context);
-
singleSampler->setupFrame(context);
for (int i = 0; i < kNumJitterLevels; i++) {
jitterSamplers[i]->setupFrame(context);
@@ -286,39 +240,24 @@
cerr << "Took " << total_time << " seconds to refine to
"<<Fragment::MaxSize<<" spp" << endl;
}
//cerr << "queue size = " << queue.size() << ", next_tile = " <<
next_tile << endl;
- //cerr << "totalTiles = " << total_tiles << endl;
}
}
void DeadlineImageTraverser::insertIntoQueue(Tile* tile, size_t thread_id)
{
- //qlock.lock();
-
queue.push(tile, tile->priority, thread_id);
-
- //qlock.unlock();
}
void DeadlineImageTraverser::insertIntoQueue(vector<Tile*>& tiles, size_t
thread_id)
{
- //qlock.lock();
-
for(size_t i=0; i < tiles.size(); i++) {
Tile* tile = tiles[i];
queue.push(tile, tile->priority, thread_id);
}
-
- //qlock.unlock();
}
DeadlineImageTraverser::Tile* DeadlineImageTraverser::popFromQueue(size_t
thread_id) {
- //qlock.lock();
- //if (queue.empty()) {
- //qlock.unlock();
- // return 0;
- //}
Tile* result = queue.pop(thread_id);
- //qlock.unlock();
return result;
}
@@ -376,7 +315,7 @@
frag.setSize(idx);
if((xcoarsepixelsize | ycoarsepixelsize) > 1){
singleSampler->renderFragment(context, frag);
- Tile* tile = &tiles[assignment];
+ Tile* tile = new Tile;
tile->xstart = xstart;
tile->ystart = ystart;
tile->xend = xend;
@@ -550,6 +489,13 @@
}
}
+ // Return the memory. TODO(boulos): Use a memory pool
+ // implementation, so that each frame we can say that "I know I'm
+ // done with any pointers I asked for even if I don't ask to
+ // delete them." (because currently the priority queue might be
+ // the only class that is holding some pointers that need to be
+ // cleaned up)
+ delete tile;
// Check size before inserting to avoid lock contention
if(childtiles.size())
insertIntoQueue(childtiles, static_cast<size_t>(context.proc));
Modified: trunk/Engine/ImageTraversers/DeadlineImageTraverser.h
==============================================================================
--- trunk/Engine/ImageTraversers/DeadlineImageTraverser.h (original)
+++ trunk/Engine/ImageTraversers/DeadlineImageTraverser.h Fri Jul 20
15:48:52 2007
@@ -93,14 +93,7 @@
int padding; // unfortunately we can't make these 128 bytes wide
};
SCIRun::Mutex qlock;
- Tile* tiles;
- //Tile** queue;
- //PriorityQueue<Tile*, float> queue;
ApproximatePriorityQueue<Tile*, float> queue;
- int next_tile;
- //int qsize;
- int total_tiles;
- int top_tiles;
bool reset_every_frame;
bool finished_coarse;
bool ShowTimeSupersample;
- [MANTA] r1521 - in trunk: Core/Math Core/Util Engine/ImageTraversers, boulos, 07/20/2007
Archive powered by MHonArc 2.6.16.