我正在阅读这篇关于使用 OpenCl 的微型分子动力学应用程序的论文http://eprints.dcs.warwick.ac.uk/1694/1/miniMD_opencl.pdf 。代码位于此处。
我对内核的实现方式感到困惑。我不明白的是这个
#if defined(SCALAR_KERNELS)
__kernel void f_clear(
__global float* f,
__const int nall) {
for (unsigned i = get_global_id(0)+1; i <= nall; i += get_global_size(0)) {
const int i4 = i << 2;
f[i4+0] = 0.0f;
f[i4+1] = 0.0f;
f[i4+2] = 0.0f;
f[i4+3] = 0.0f;
}
}
#elif defined(VECTOR_KERNELS)
__kernel __attribute__((vec_type_hint(float4)))
void f_clear(
__global float4* f,
__const int nall) {
const float4 zeroes = (float4) (0.0f, 0.0f, 0.0f, 0.0f);
for (unsigned i = get_global_id(0)+1; i <= nall; i += get_global_size(0)) {
f[i] = zeroes;
}
}
#endif
假设VECTOR_KERNELS
并SCALAR_KERNELS
对应于 GPU 和 MIC 设备,但不确定。
这是否与 MIMD SIMD 指令或多核和矢量编程有关?
现在使用矢量类型还有真正的优势吗?
最后,我真的不知道这两个 for 循环做了什么以及它们的目的。
为什么不直接做f[get_global_id(0)]
?
谢谢,
埃里克。