【问题标题】:Access components of vector data type (e.g. int4) as array of scalars in OpenCL在 OpenCL 中将向量数据类型(例如 int4)的组件作为标量数组访问
【发布时间】:2022-11-03 01:23:21
【问题描述】:

我有内核,它评估原子的所有邻居对之间的相互作用。每个原子都有最大值。 4 个邻居,所以我将他们的索引存储在 int4 中。但是为了遍历这些邻居,我需要通过索引(neighs[0] 而不是 neighs.x )访问它们。

循环应该类似于:

int iatom = get_global_id(0);
int4 ng   = neighs[iatom];   // each atoms has 4 neighbors
float4 p0    = atom_pos[iatom];
float4 force = (float)(0.f,0.f,0.f,0.f);
for(int i=0; i<4; i++){
    int ing = ng[i];         // HERE: index into vector
    float4 pi = atom_pos[ing];
    for(int j=i+1; j<4; j++){
       int jng = ng[j];      // HERE: index into vector
       float4 pj = atom_pos[jng];
       force += evalInteraction( p0, pi, pj ); 
    }
}
forces[iatom]=force;

我有一些想法如何可能完成但不确定:

  1. 展开循环
    因为只有 4*3/2=6 对交互,所以它可能会更有效。但它的可读性要差得多,修改起来也更困难。
  2. int4 转换为int*
    但可以吗?它不会破坏什么吗?它不会造成一些性能问题吗?我的意思是:
    int4 ng_  = neighs[iatom]; // make sure we copy it to local memory or register
    int* ng   = (int*)&ng_;    // pointer to local memory can be optimized out, right ?
    for(int i=0; i<4; i++){
        int ing = ng[i];
        ...
    }
    
    

【问题讨论】:

    标签: opencl opencl-c


    【解决方案1】:

    您可以直接强制转换,但您也可以声明一个联合以便于访问:

    union
    {
        int  components[4];
        int4 vector;
    } neighbors;
    
    neighbors.vector = ng;
    neighbors.components[i]; // Works now
    

    【讨论】:

      猜你喜欢
      • 2012-04-05
      • 2020-09-04
      • 2013-12-15
      • 1970-01-01
      • 2019-12-02
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      • 1970-01-01
      相关资源
      最近更新 更多