我正在使用vloadn加载数据,并且作为参数,我传递了要读取的范围并且它可以工作,但是我想知道vload4的行为是什么。如果这可能会导致一些意外的问题,或者我绝对安全地这样做。一个例子可能是这样的:
__kernel void myKernel(__global float* data_ptr, int size)
{
float4 vec = vload4(0, data_ptr);
float sum = 0.f;
// data_ptr points to an array of 2 floats in global mem
if (size == 2) {
sum += vec.s1;
sum += vec.s0;
}
else if (size == 1) {
sum += vec.s0;
}
}
data_ptr是全局内存中2个浮点数的数组,但是即使我仅访问这2个浮点数,我也使用vload4加载了4个浮点数。我问的原因是我要使用单个vloadn,然后再根据大小决定实际要使用多少,而不是根据大小使用vloadn(例如,对于size == 4,请使用vload4,对于size == 8,请使用vload8等
答案 0 :(得分:0)
如果它仍在data_ptr
之内,那就没问题了;您不必使用所有读取的数据。但是,如果您读过data_ptr
所指向的缓冲区的任一端,则可能会遇到问题(例如,内存读取异常或某些其他与设备有关的错误)。注意:请检查vload
的地址对齐要求,以查看是否允许您读取任何地址或仅读取其大小的倍数。