【发布时间】: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;
我有一些想法如何可能完成但不确定:
- 展开循环
因为只有 4*3/2=6 对交互,所以它可能会更有效。但它的可读性要差得多,修改起来也更困难。 - 将
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]; ... }
【问题讨论】: