Всегда существует компромисс между быстрой, но ограниченной регистрацией / общей памятью и медленной, но большой глобальной памятью.Там нет никакого способа «обойти» этот компромисс.Если вы используете сокращение использования регистров с помощью глобальной памяти, вы должны получить более высокую загрузку, но более медленный доступ к памяти.
Тем не менее, вот некоторые идеи использовать меньшее количество регистров:быть предварительно вычисленным и сохраненным в постоянной памяти?Тогда каждому потоку просто нужно посмотреть shift [i].
Должны ли a и c быть числами с плавающей точкой? Или, a и c можно удалить из цикла и вычислить один раз?И, таким образом, удаляется полностью?
a вычисляется как простая арифметическая последовательность, поэтому уменьшите ее ... (примерно так)
a = ((NEIGHBORS-shift) - (-shift) + 1) * ((NEIGHBORS-shift) + (-shift)) / 2
или
a = (NEIGHBORS + 1) * ((NEIGHBORS - 2*shift)) / 2
поэтому вместо этого сделайте что-то вроде следующего (возможно, вы сможете еще больше сократить эти выражения):
str[i] = AMP*((NEIGHBORS + 1) * ((NEIGHBORS - 2*shift)) / 2*e-NEIGHBOURS*f)
str[i] /= ((NEIGHBORS + 1) * ((NEIGHBORS - 2*shift)) / 2*(NEIGHBORS + 1) * ((NEIGHBORS - 2*shift)) / 2-NEIGHBOURS*c)
str[i] /= (float)BLOCK_SPACING;