使用vloadn(opencl)加载未分配的内存

时间:2019-05-15 22:15:31

标签: opencl

我正在使用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等

1 个答案:

答案 0 :(得分:0)

如果它仍在data_ptr之内,那就没问题了;您不必使用所有读取的数据。但是,如果您读过data_ptr所指向的缓冲区的任一端,则可能会遇到问题(例如,内存读取异常或某些其他与设备有关的错误)。注意:请检查vload的地址对齐要求,以查看是否允许您读取任何地址或仅读取其大小的倍数。