Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何处理OpenCl中超出范围的缓冲区的情况?_Opencl - Fatal编程技术网

如何处理OpenCl中超出范围的缓冲区的情况?

如何处理OpenCl中超出范围的缓冲区的情况?,opencl,Opencl,OpenCl内核代码: __kernel void calc(__global double* arr1, __global double* arr2, __global double* arr3) { int g = get_global_id(0); if (g > 6400) { return; } arr1[g] = arr3[g] * 10.0; arr2[g] = arr3[g] * 20.0 } 工作组规模:6400

OpenCl内核代码:

__kernel void calc(__global double* arr1, __global double* arr2, __global double* arr3)
{
    int g = get_global_id(0);
    if (g > 6400) {
        return;
    }

    arr1[g] = arr3[g] * 10.0;
    arr2[g] = arr3[g] * 20.0
}
工作组规模:6400

这个内核将使用arr3来求解arr1和arr2但问题是arr2的大小仅为3200。因此,这将不起作用。如何处理OpenCl中超出范围的缓冲区的情况

我可以考虑使用条件语句。但我不想要任何if-else语句,比如:

__kernel void calc(__global double* arr1, __global double* arr2, __global double* arr3)
{
    int g = get_global_id(0);
    if (g > 6400) {
        return;
    }

    arr1[g] = arr3[g] * 10.0;

    if (g < 3200) {
        arr2[g] = arr3[g] * 20.0
    }
}
\uuuuu内核无效计算(\uuuu全局双精度*arr1、\uuuu全局双精度*arr2、\uuuu全局双精度*arr3)
{
int g=获取全局id(0);
如果(g>6400){
返回;
}
arr1[g]=arr3[g]*10.0;
if(g<3200){
arr2[g]=arr3[g]*20.0
}
}
我也不想在arr2中添加任何虚拟缓冲区或额外的缓冲区,这将增加我的缓冲区大小


如何在OpenCl中处理此类场景?任何帮助/建议/链接都将不胜感激。

您的解决方案似乎很合理。你为什么质疑它?你担心它会增加线程分歧吗?不会的,因为在一个工作组中,情况很可能是一样的。@Dithermaster我也认为这个解决方案对我更有效。。但在我的例子中,不同数组大小的数组可能更难计算。。如果不是这样的话,再加上这么多,我想可能不是一个可行的办法。。有什么方法可以在opencl中处理这样的场景吗?如果这变得复杂,那么就使用不同的内核。在最近的硬件上,它们甚至可以并行执行。但正如Dithermaster所说,我不会太担心这一点。还有,你到底期望什么?OpenCLC是常规的C99,它本身无法在这些场景中创造奇迹。。我已经尝试了我所知道的一切。我只是在找我可能丢失的东西。如果没有,那我就相信了。