Я пытаюсь реализовать оптимизацию на CUDA Reduction и должен был успешно завершиться до части 6. Спасибо всем вам за помощь. Чтобы получить полное представление о CUDA, мне также нужно закончить окончательную оптимизацию, как указано в слайде № 31, известном как каскадирование алгоритма.Пример оптимизации оптимизации CUDA
Идея состоит в том, чтобы иметь 512 элементов на поток и суммировать их все до начала выполнения.
Я пробовал с подходом, где каждый мой поток имел доступ к непрерывным 512 номерам из памяти. К сожалению, его производительность была наихудшей. Я угадываю причину быть банковскими конфликтами, но до сих пор не понял точно. Может ли кто-нибудь из вас предложить причину такого поведения?
Я также отправляю образец кода, предоставленный Nvidia ниже.
unsigned int tid = threadIdx.x;
unsigned int i = blockIdx.x*(blockSize*2) + threadIdx.x;
unsigned int gridSize = blockSize*2*gridDim.x;
sdata[tid] = 0;
while (i < n) {
sdata[tid] += g_idata[i] + g_idata[i+blockSize];
i += gridSize;
}
__syncthreads();
Несколько параметров остались неопределенными. Я могу сделать вывод, что blockSize равно числу потоков на блок. Но я не могу сделать вывод о важности переменной «gridSize». Каков подходящий способ доступа к памяти, чтобы мы получили лучшую производительность? Является ли это примером плавного доступа?
Благодарим вас за помощь и комментарий ниже, если у вас есть другие вопросы.
Полностью обработанные примеры для всех этих сокращающих кодов приведены в соответствующем [CUDA примере кода] (http://docs.nvidia.com/cuda/cuda-samples/index.html#cuda-parallel-reduction). Вам не нужно догадываться о каких-либо параметрах. Я сомневаюсь, что вы предоставили достаточно информации, чтобы объяснить ваше наблюдение. Если ваша реализация части 6 работает не очень хорошо, возможно, вам нужно запустить образец кода CUDA и изучить различия. –