У меня есть массив значений 20 КБ, и я уменьшаю его на 50 блоков по 400 потоков в каждом. num_blocks = 50 и block_size = 400.
Мой код выглядит так:
getmax <<< num_blocks,block_size >>> (d_in, d_out1, d_indices);
__global__ void getmax(float *in1, float *out1, int *index)
{
// Declare arrays to be in shared memory.
__shared__ float max[threads];
int nTotalThreads = blockDim.x; // Total number of active threads
float temp;
float max_val;
int max_index;
int arrayIndex;
// Calculate which element this thread reads from memory
arrayIndex = gridDim.x*blockDim.x*blockIdx.y + blockDim.x*blockIdx.x + threadIdx.x;
max[threadIdx.x] = in1[arrayIndex];
max_val = max[threadIdx.x];
max_index = blockDim.x*blockIdx.x + threadIdx.x;
__syncthreads();
while(nTotalThreads > 1)
{
int halfPoint = (nTotalThreads >> 1);
if (threadIdx.x < halfPoint)
{
temp = max[threadIdx.x + halfPoint];
if (temp > max[threadIdx.x])
{
max[threadIdx.x] = temp;
max_val = max[threadIdx.x];
}
}
__syncthreads();
nTotalThreads = (nTotalThreads >> 1); // divide by two.
}
if (threadIdx.x == 0)
{
out1[num_blocks*blockIdx.y + blockIdx.x] = max[threadIdx.x];
}
if(max[blockIdx.x] == max_val )
{
index[blockIdx.x] = max_index;
}
}
Проблема / проблема здесь в том, что в какой-то момент значение nTotalThreads не равно степени 2, что приводит к значению мусора для индекса. Массив out1 дает мне максимальное значение в каждом блоке, которое является правильным и проверенным. Но значение индекса неверно. Например: максимальное значение в первом блоке происходит при index = 40, но ядро дает значения индекса как 15. Аналогично, значение max во втором блоке равно 440, но ядро дает 416.
Есть предложения ??