#include "reductions.cu"
#include "IOptimizer.cuh"
extern __shared__ float array[];
__global__ void setup_kernel(curandState *state, unsigned long seed)
{
uint32_t posID = IMUL( IMUL(blockIdx.x, gridDim.y) + blockIdx.y, blockDim.x) + threadIdx.x;
curand_init(seed, posID, 0, &state[posID]);
}
template <uint32_t threadNum>
static __global__ void findBestFitness(float* g_fitnesses, float *g_globalBestFitness,
uint32_t* g_globalBestID, int solution_number)
{
float* s_fitnesses = (float*) array;
uint32_t tid = threadIdx.x;
uint32_t setID = blockIdx.x;
uint32_t posID = IMUL(setID, solution_number) + tid;
float bestFitness;
#ifdef MAXIMIZE
s_fitnesses[tid] = -1e20; bestFitness = -1e20;
#else
s_fitnesses[tid] = 1e20; bestFitness = 1e20;
#endif
if (tid < solution_number)
{
bestFitness = g_fitnesses[posID];
s_fitnesses[tid] = bestFitness;
}
#ifdef MAXIMIZE
reduceToMax<threadNum>(s_fitnesses, tid);
#else
reduceToMin<threadNum>(s_fitnesses, tid);
#endif
if (tid == 0)
g_globalBestFitness[setID] = s_fitnesses[0];
__syncthreads();