MegaCraZy6
@MegaCraZy6
Юзерь

CUDA как правильно оптимизировать?

Есть кусок кода, как по мне он достаточно простой, но выполняется целых 5 миллисекунд, как-то это много, как для параллельных вычислений.

__global__ void kernel_compute_global_lighting(float* device_lenght_buff, CudaRenderWindow render_window, CudaRenderCamera camera, CudaRenderMap map, CudaRenderTextures textures, CudaRenderLight lights) {
	int pixel_coordinate_y = blockIdx.x * blockDim.x + threadIdx.x;
	int pixel_coordinate_x = blockIdx.y * blockDim.y + threadIdx.y;
	if (pixel_coordinate_y >= render_window.render_height || pixel_coordinate_x >= render_window.render_width)
		return;
	render_window.device_rendered_window[pixel_coordinate_y*render_window.render_width + pixel_coordinate_x].r = render_window.device_render_window[pixel_coordinate_y*render_window.render_width + pixel_coordinate_x].r * lights.device_light_pointers[0]->r;
	render_window.device_rendered_window[pixel_coordinate_y*render_window.render_width + pixel_coordinate_x].g = render_window.device_render_window[pixel_coordinate_y*render_window.render_width + pixel_coordinate_x].g * lights.device_light_pointers[0]->g;
	render_window.device_rendered_window[pixel_coordinate_y*render_window.render_width + pixel_coordinate_x].b = render_window.device_render_window[pixel_coordinate_y*render_window.render_width + pixel_coordinate_x].b * lights.device_light_pointers[0]->b;
}


Для того чтобы вызвать этот Kernel, использую такие параметры:
Сетка
X : (900 + 31) / 32
Y : (1400 + 31) / 32);
Потоки
X: 32
Y: 32

Пытался сжимать косвенную адресацию, делал промежуточный обьект для проведениче вычислений, чтоб сократить количество обращений к памяти. Но все что как по мне должно ускорять выполнение, наоборот делает задержку только больше.
Как мне тогда быть с изображениями выше 1024х800

Просто подскажите что именно тут больше всего влияет, устал рыть без результата...
  • Вопрос задан
  • 97 просмотров
Решения вопроса 1
tumbler
@tumbler
бекенд-разработчик на python
  1. Во-первых, стоит удостовериться, что Вы измерили именно скорость выполнения кода, а не загрузки данных, выполнения и выгрузки результата.
  2. Во-вторых, попробуйте избавиться от if совсем (можно добавить неиспользуемые поля до размера блока).
  3. В-третьих, используйте векторное умножение вместо отдельных операций в три строки.
  4. В-четвертых, посмотрите размеры блока для вашей карты, может не влезаете.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы