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

使用vloadn(opencl)加载未分配的内存,opencl,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 o

我使用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,而不是使用多少vloadn(例如,对于大小==4,使用vload4;对于大小==8,使用vload8等。

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

这就是我所担心的。如果我在C中使用类似memcpy的东西来复制4个元素,它将从数组中复制前2个元素,而其他2个元素将是一些垃圾,这是在我t、 但它不会触发mem读取异常。在这种情况下,vload会导致mem读取异常吗?如果分配的内存小于我尝试读取的内存?当然。你的memcpy也可能会。你只是幸运地发现你的页表足够大。你永远不应该读或写到末尾(或开头)缓冲区;它可能不是您的内存,可能会触发异常。