Opencl,使用指向不同本地内存的全局指针会创建分支吗?

Opencl, Will using global pointer to different local memory create branching?

我有这样的内核

kernel void k1(global int * a, global int * b, global int * c){
  int i = get_local_id(0);
  global int* ptr;
  if (i==0) ptr = &a[0];
  if (i==1) ptr = &b[0];
  if (i==2) ptr = &c[0];
  if (i>2) return;
  ptr[0]++;

}

我的问题是,行 ptr[0]++ 会在访问内存时创建分支吗?或者与相比,这会节省时间吗 a[0]++;b[0]++;c[0]++;在同一个工作项中。

谢谢你的时间。

不,这不会创建分支,但至少会在某些工作组中破坏联合内存访问。

您还可以通过三元运算符 (condition ? true_action : false_action) 或位掩码完全替换 if(i==0) ptr = &a[0]; 等。如此简单的 if 语句和三元运算符最有可能转换为无分支汇编。如果不是保护子句(if(i>2) return;),那么整个代码就是无分支的。

虽然没有分支,但更重要的是,尤其是使用比您拥有的更复杂的指针算法(例如,当查找 table 确定指针值时),告诉应该访问哪个内存位置的算法将打破某些工作组中合并的内存访问,与简单分支本身相比,这可能会导致更慢的速度(尽管分支也不会解决未对齐的内存访问)。

在某些应用程序中,以合并方式加载更多全局内存甚至可能比减少全局内存访问但在此过程中破坏合并更快。