void CGeneticStrategyCLv2::nextGeneration( CRandom* rand ) { size_t bufSize = (2 * pAntCommon->statesCount() * stateSize + 4)*N*M; size_t cacheSize = N*M*sizeof(float); try { //queue.enqueueNDRangeKernel( kernelGen, cl::NullRange, cl::NDRange(N, M), cl::NullRange ); boost::this_thread::disable_interruption di; queue.enqueueNDRangeKernel( kernelGen, cl::NullRange, globalRange, localRange ); queue.finish(); queue.enqueueReadBuffer( statesBufCL2, CL_FALSE, 0, bufSize, buffer ); queue.enqueueReadBuffer( statesBufCL1, CL_FALSE, 0, bufSize, buffer2 ); queue.enqueueReadBuffer( resultCache, CL_FALSE, 0, 2*cacheSize, cachedResults ); }catch( cl::Error& error ) { Tools::throwDetailedFailed( "[FAILED] Failed to get next generation", streamsdk::getOpenCLErrorCodeStr( error.err() ), &logger ); }catch( std::exception& ex ) { int k = 0; throw ex; } //ToDo: count buffer, buffer2 boost::mutex& mutex = result->getMutex(); boost::mutex::scoped_lock lock(mutex); queue.finish(); addGeneration( buffer2, cachedResults ); addGeneration( buffer, cachedResults + N*M ); }
/* Creation de n generations si ce n'est pas deja fait */ void createGen(Generations* generations, Lsystem lsystem, int n) { if (n>lenghtGen(generations)-1){ Generations* l=generations; while (l->next!=NULL) { l = l->next; } while (n!=lenghtGen(generations)-1){ generations = addGeneration(generations,nextGen(l->generation,lsystem)); l = l->next; } } }
//-------------------------------------------------------------- void testApp::mousePressed(int x, int y, int button){ addGeneration(); }