Opencl 已知最大尺寸的手动循环展开

Opencl 已知最大尺寸的手动循环展开,opencl,loop-unrolling,Opencl,Loop Unrolling,请在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 dire

请在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);
}
uint point\u color=4278190080;
浮点数_百分比=1.0f;
浮动接近像素大小=(…);
浮点远像素大小=(…);
浮点增量像素大小=远像素大小-近像素大小;
浮动3近=(…);
浮动3远=(…);
float3方向=正常化(远-近);
点位置=(…)+10;
对于(大小p=0;p拒绝长度和点百分比>百分比);
点颜色=(是否候选?(uint)点列表[点位置+3]| 4278190080:点颜色);
点数百分比=(是否为候选?百分比:点数百分比);
}
此代码尝试在列表中查找距离远和近线段最近的点,并将其颜色指定给point_color,将其“百分比距离”指定给point_percent。(顺便说一句,代码似乎还可以)

point_count指定的元素数量是可变的,因此我不能对此假设太多,只需一件事:point_count将始终等于或小于8。在我的代码和数据中,这是一个固定的事实

我想手动展开这个循环,恐怕我需要使用很多

value = (point_count < constant ? new_value : value)
value=(点计数<常数?新值:值)
对于其中的所有行。根据您的经验,这样的策略会提高我的内核的性能吗

是的,我知道,我应该自己进行一些基准测试;在我亲自尝试之前,我只是想问问在OpenCL方面有丰富经验的人。

大多数OpenCL驱动程序(至少我很熟悉)都支持在编译时使用
#pragma unroll
来展开循环。简单地像这样使用它:

#pragma unroll
for (int i = 0; i < 4; i++) {
    /* ... */
}
#pragma展开
对于(int i=0;i<4;i++){
/* ... */
}
它实际上与手动展开它一样,不需要任何努力。在您的情况下,这可能看起来更像:

if (pointCount == 1) {
    /* ... */
} else if (pointCount == 2) {
    #pragma unroll
    for (int i = 0; i < 2; i++) { /* ... */ }
} else if (pointCount == 3) { 
    #pragma unroll
    for (int i = 0; i < 3; i++) { /* ... */ }
}
if(pointCount==1){
/* ... */
}else if(pointCount==2){
#布拉格展开
对于(int i=0;i<2;i++){/*…*/}
}如果(pointCount==3){
#布拉格展开
对于(int i=0;i<3;i++){/*…*/}
}
我不能肯定是否会有改进,但有一种方法可以找到。例如,如果本地工作组的
pointCount
为常量,则可能会提高性能,但如果它是完全可变的,则实际情况可能会更糟

你可以阅读更多关于它的内容