Я собираюсь написать ядро CUDA для выполнения одной операции над каждым отдельным элементом матрицы (например, квадратное укоренение каждого элемента, возведение в степень или вычисление синуса / косинуса, если все числа находятся между [-1; 1] и т.д ..)
Я выбрал размеры сетки блоков / потоков, и я думаю, что код довольно прост и прост, но я спрашиваю себя ... что я могу сделать, чтобы максимизировать объединение / заполнение SM?
Моя первая идея состояла в том, чтобы заставить все полусвернутые (16 потоков) загружать ансамбль данных из глобальной памяти и затем помещать их все для вычислений, но он обнаруживает, что не хватает параллелизации передачи / вычисления памяти .. Я имею в виду все потоки загрузить данные, затем вычислить, затем загрузить снова данные, затем снова вычислить .. это звучит очень плохо с точки зрения производительности.
Я подумал, что было бы неплохо использовать разделяемую память, возможно, использовать какую-то локальность для того, чтобы поток загружал больше данных, чем на самом деле, чтобы облегчить работу других потоков, но это звучит глупо, потому что второе будет ждать, пока первое закончите загрузку данных перед началом работы.
Я не совсем уверен, что дал правильное представление о моей проблеме, я просто получаю идеи, прежде чем приступить к работе над чем-то конкретным.
Каждый комментарий / предложение / критик хорошо принят и спасибо.