Давайте посмотрим на две из трех ваших строк кода:
sum[0] = sum[0]+a[tid] * b[tid]; //every thread write to the sum[0]
__syncthreads();
Первая строка содержит гонку памяти.Каждый поток в блоке будет одновременно пытаться записать в сумму [0].В модели исполнения cuda нет ничего, что могло бы помешать этому.Не существует автоматической сериализации или защиты памяти, которая может остановить это поведение.
Вторая строка - это барьер инструкций.Это означает, что каждый перекос нитей будет заблокирован, пока каждый перекос нитей не достигнет барьера.Он никак не влияет на предыдущие инструкции, он никак не влияет на согласованность памяти или поведение любых транзакций памяти, которые выдает ваш код.
Код, который вы написали, необратимо нарушен.Канонический способ выполнения такого рода операций - параллельное сокращение.Это можно сделать разными способами.Это, вероятно, наиболее описанный и документированный параллельный алгоритм для графических процессоров.Если вы установили инструментарий CUDA, у вас уже есть и полный рабочий пример, и исчерпывающий документ, описывающий алгоритм, как он будет реализован с использованием общей памяти.Я предлагаю вам изучить его.
Вы можете увидеть (почти) работающую реализацию точечного продукта с использованием общей памяти здесь , которую я рекомендую вам изучить.Вы также можете найти оптимальные реализации сокращения параллельных блоков в таких библиотеках, как cub