使用VLOADN(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并决定实际上要使用多少,而不是基于size使用vloadn(例如size == 4使用vload4,用于size == 8 vload8等。

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

最新更新