Пожалуйста, взгляните на этот код в ядре OpenCL:
uint point_color = 4278190080;
float point_percent = 1.0f;
float near_pixel_size = (...);
float far_pixel_size = (...);
float delta_pixel_size = far_pixel_size - near_pixel_size;
float3 near = (...);
float3 far = (...);
float3 direction = normalize(far - near);
point_position = (...) + 10;
for (size_t p = 0; p < point_count; p++, position += 4)
{
float3 point = (float3)(point_list[point_position], point_list[point_position + 1], point_list[point_position + 2]);
float projection = dot(point - near, direction);
float3 projected = near + direction * projection;
float rejection_length = distance(point, projected);
float percent = projection / segment_length;
float pixel_size = near_pixel_size + percent * delta_pixel_size;
bool is_candidate = (pixel_size > rejection_length && point_percent > percent);
point_color = (is_candidate ? (uint)point_list[point_position + 3] | 4278190080 : point_color);
point_percent = (is_candidate ? percent : point_percent);
}
Этот код пытается найти в списке точку, ближайшую к отрезку линии между дальним и ближним, и присваивает ее цвет point_color и его "процентное расстояние" в point_percent. (Кстати, код вроде в порядке).
Количество элементов, указанное параметром point_count, является переменной величиной, поэтому я не могу предполагать слишком много об этом, за исключением одного: point_count всегда будет меньше или равно 8. Это фиксированный факт в моем коде и данных.
Я хотел бы развернуть этот цикл вручную, и я боюсь, что мне придется использовать много
value = (point_count < constant ? new_value : value)
для всех строк в нем. По вашему опыту, повысит ли такая стратегия производительность моего ядра?
И да, я знаю, я должен сам провести кое-какой бенчмаркинг; Я просто хотел спросить кого-нибудь с большим опытом работы с OpenCL, прежде чем пытаться сделать это самостоятельно.