我正在使用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并决定实际上要使用多少,而不是基于size使用vloadn(例如size == 4使用vload4,用于size == 8 vload8等。
如果它仍然在data_ptr
之内,则可以。您不必使用阅读的所有数据。但是,如果您读取了缓冲区的任何一端,则data_ptr
指向您可能会遇到问题(例如,内存读取异常,或其他与设备相关的错误错误(。注意:检查vload
的地址对齐要求,以查看您是否允许您在大小的任何地址或仅读取多个地址。