float* positions, float* potentialPositions, float2* bounds, curandState* devStates) { const uint32_t tid = threadIdx.x; const uint32_t solutionID = IMUL(blockIdx.x, gridDim.y) + blockIdx.y; const uint32_t posID = IMUL( solutionID, actualSolutionSize) + tid; curandState localState = devStates[posID]; if(tid < problemDimension) { float y = positions[posID] + (-0.1f + (curand_uniform(&localState) * 0.2f)); cropPosition(bounds, y, blockIdx.x, tid, actualSolutionSize); potentialPositions[posID] = y; } devStates[posID] = localState; } __global__ void sa_selection (float* positions, float* potentialPositions, float temp, float* fitnesses, float* potentialFitnesses, unsigned int problemDimension, unsigned int actualSolutionSize, curandState* devStates) { uint32_t tid = threadIdx.x; const uint32_t solutionPosID = IMUL(blockIdx.x, gridDim.y)+blockIdx.y; uint32_t posID = IMUL( solutionPosID, actualSolutionSize) + tid; __shared__ bool update; curandState localState = devStates[posID]; if (tid == 0) { float potentialFitness = potentialFitnesses[solutionPosID]; float oldFitness = fitnesses[solutionPosID]; if ((potentialFitness BETTER_THAN oldFitness) || #ifdef MAXIMIZE (exp((potentialFitness - oldFitness)/temp) > curand_uniform(&localState) ) ) #else (exp((oldFitness - potentialFitness)/temp) > curand_uniform(&localState) ) ) #endif { update = true; fitnesses[solutionPosID] = potentialFitness; } else update = false; } __syncthreads (); if (update && tid<problemDimension) positions[posID] = potentialPositions[posID];