Идеи для улучшения скорости:
Если возможно, рассчитайте вариации прог в коде CUDA, используя threadIdx и blockIdx. Вычисления выполняются быстрее, чем доступ к памяти.
Будьте осторожны с разделяемой памятью (вы упомянули, что ее следует игнорировать, но все равно здесь). Вы должны убедиться, что каждый поток блока использует свой индекс. И убедитесь, что индекс на поток в деформации идет в другой банк, в противном случае у вас есть снижение производительности.
Так что, если у вас есть блоки размером 128 потоков, а я содержит номер потока:
__shared__ float buf[128 * 6];
buf[0] -> buf[0*128 + i];
buf[1] -> buf[1*128 + i];
buf[prog[0]] -> buf[prog[0]*128 + i];
...
Поскольку размер блока (128) делится на 32, каждый поток внутри деформации получает доступ к другому банку совместно используемой памяти, даже если индекс программы отличается. поток 0 всегда обращается к bank0 и т. д.
Альтернатива
Попытка хранить буферы непосредственно в регистрах вместо общей памяти: buf0, buf1, buf2, ...
Как получить к ним доступ по индексу? Просто напишите встроенную функцию или макрос с переключателем.
Есть 6 * 6 * 6 * 6 * 6 * 6 возможностей. Вы можете попробовать оптимизировать, сгенерировав код для 36 или 216 возможностей, а затем просто вызвать подходящий вариант. Например,
switch(prog01) {
case 0: buf3 = buf0 + buf0; break;
case 1: buf3 = buf0 + buf1; break;
...
case 6: buf3 = buf1 + buf0; break;
...
}
Но, возможно, это быстрее, если вы сделаете 6 переключателей по 6 случаев в каждом, тогда у вас будет меньше случаев / сравнений / переходов.
Лучше всего будет: сделать половину переключатели (например, 216) вне l oop, половина переключателей внутри одного из циклов 216.
Возможно, было бы еще лучше создать указатели функций устройства вне l oop и вызвать соответствующая функция, которая выбирает буф. Но тогда эти функции должны будут выбирать из буфера в качестве параметров функции вместо локальных переменных. Надеемся, что они по-прежнему эффективно хранятся в регистрах.
Локальный доступ обычно довольно быстрый. Если у вас есть локальные переключатели и переходы, вы теряете время вычислений. Поэтому убедитесь, что потоки каждой деформации достаточно выровнены с аналогичными параметрами программы.
Пожалуйста, сравните и протестируйте с полными деформациями (не только с одним потоком), чтобы получить более реалистичные результаты c, включая банковские коллизии в общей памяти .