diff --git a/Source/Ember/Iterator.h b/Source/Ember/Iterator.h index 72793e1..4decbf4 100644 --- a/Source/Ember/Iterator.h +++ b/Source/Ember/Iterator.h @@ -6,8 +6,8 @@ /// Iterator and derived classes. /// -//#define CHOOSE_XFORM_GRAIN 256 -#define CHOOSE_XFORM_GRAIN 10000//The size of xform random selection buffer. Multiply by the (number of non-final xforms present + 1) if xaos is used. +#define CHOOSE_XFORM_GRAIN 16384//The size of xform random selection buffer. Multiply by the (number of non-final xforms present + 1) if xaos is used. +#define CHOOSE_XFORM_GRAIN_M1 16383//All 1s, so it's logically and-able. namespace EmberNs { @@ -259,7 +259,7 @@ protected: /// size_t NextXformFromIndex(size_t index, size_t distribOffset = 0) { - return size_t(m_XformDistributions[(index % CHOOSE_XFORM_GRAIN) + (CHOOSE_XFORM_GRAIN * distribOffset)]); + return size_t(m_XformDistributions[(index & CHOOSE_XFORM_GRAIN_M1) + (CHOOSE_XFORM_GRAIN * distribOffset)]); } vector m_XformDistributions; diff --git a/Source/EmberCL/IterOpenCLKernelCreator.cpp b/Source/EmberCL/IterOpenCLKernelCreator.cpp index 6e3b646..ba74658 100644 --- a/Source/EmberCL/IterOpenCLKernelCreator.cpp +++ b/Source/EmberCL/IterOpenCLKernelCreator.cpp @@ -301,7 +301,7 @@ string IterOpenCLKernelCreator::CreateIterKernelString(Ember& ember, strin os << #ifndef STRAIGHT_RAND " if (THREAD_ID_Y == 0 && THREAD_ID_X < NWARPS)\n" - " xfsel[THREAD_ID_X] = MwcNext(&mwc) % " << CHOOSE_XFORM_GRAIN << ";\n"//It's faster to do the % here ahead of time than every time an xform is looked up to use inside the loop. + " xfsel[THREAD_ID_X] = MwcNext(&mwc) & " << CHOOSE_XFORM_GRAIN_M1 << ";\n"//It's faster to do the & here ahead of time than every time an xform is looked up to use inside the loop. "\n" #endif " barrier(CLK_LOCAL_MEM_FENCE);\n" @@ -322,7 +322,7 @@ string IterOpenCLKernelCreator::CreateIterKernelString(Ember& ember, strin { os << #ifdef STRAIGHT_RAND - " secondPoint.m_LastXfUsed = xformDistributions[MwcNext(&mwc) % " << CHOOSE_XFORM_GRAIN << " + (" << CHOOSE_XFORM_GRAIN << " * (firstPoint.m_LastXfUsed + 1u))];\n\n"; + " secondPoint.m_LastXfUsed = xformDistributions[MwcNext(&mwc) & " << CHOOSE_XFORM_GRAIN_M1 << " + (" << CHOOSE_XFORM_GRAIN << " * (firstPoint.m_LastXfUsed + 1u))];\n\n"; #else " secondPoint.m_LastXfUsed = xformDistributions[xfsel[THREAD_ID_Y] + (" << CHOOSE_XFORM_GRAIN << " * (firstPoint.m_LastXfUsed + 1u))];\n\n";//Partial cuburn hybrid. #endif @@ -331,7 +331,7 @@ string IterOpenCLKernelCreator::CreateIterKernelString(Ember& ember, strin { os << #ifdef STRAIGHT_RAND - " secondPoint.m_LastXfUsed = xformDistributions[MwcNext(&mwc) % " << CHOOSE_XFORM_GRAIN << "];\n\n";//For testing, using straight rand flam4/fractron style instead of cuburn. + " secondPoint.m_LastXfUsed = xformDistributions[MwcNext(&mwc) & " << CHOOSE_XFORM_GRAIN_M1 << "];\n\n";//For testing, using straight rand flam4/fractron style instead of cuburn. #else " secondPoint.m_LastXfUsed = xformDistributions[xfsel[THREAD_ID_Y]];\n\n"; #endif @@ -408,7 +408,7 @@ string IterOpenCLKernelCreator::CreateIterKernelString(Ember& ember, strin "\n" //Populate randomized xform index buffer with new random values. " if (THREAD_ID_Y == 0 && THREAD_ID_X < NWARPS)\n" - " xfsel[THREAD_ID_X] = MwcNext(&mwc) % " << CHOOSE_XFORM_GRAIN << ";\n" + " xfsel[THREAD_ID_X] = MwcNext(&mwc) & " << CHOOSE_XFORM_GRAIN_M1 << ";\n" "\n" " barrier(CLK_LOCAL_MEM_FENCE);\n" //Another thread will have written to this thread's location, so read the new value and use it for accumulation below.