我正在讀這篇文章http://eprints.dcs.warwick.ac.uk/1694/1/miniMD_opencl.pdf關於使用OpenCl的迷你分子動力學應用。代碼位於此處。
我遇到了內核如何實現。我不明白的是這OpenCl中的標量和矢量內核
#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)]
?
謝謝,
Éric。