Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.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,我见过这样的解决方案: kernel dp_square (const float *a, float *result) { int id = get_global_id(0); result[id] = a[id] * a[id]; } 及 内核dp_平方(常量浮点*a, 浮点*结果,常量无符号整数计数) { int id=获取全局id(0); 如果(id

我见过这样的解决方案:

kernel dp_square (const float *a,
float *result)
{
int id = get_global_id(0);
result[id] = a[id] * a[id];
}

内核dp_平方(常量浮点*a,
浮点*结果,常量无符号整数计数)
{
int id=获取全局id(0);
如果(id<计数)
结果[id]=a[id]*a[id];
}
检查id在第一个例子中,它不存在的原因是程序员仅仅确保全局大小等于要处理的元素的数量(这正常吗)?

这通常有两个原因--

  • 确保开发人员错误不会杀死代码或读取坏内存

  • 因为有时运行的工作项比数据点多是最佳的。例如,如果我的设备的最佳工作组大小为32(并非罕见),并且我有一个包含61条数据的数组,那么我将运行64个工作项,最后三个工作项将只是“装死”


  • 为了不包含此检查,您必须使用工作组大小除以工作项总数。在这种情况下,您的工作组大小将为1(因为61是prime),这将非常缓慢

    这样做通常有两个原因--

  • 确保开发人员错误不会杀死代码或读取坏内存

  • 因为有时运行的工作项比数据点多是最佳的。例如,如果我的设备的最佳工作组大小为32(并非罕见),并且我有一个包含61条数据的数组,那么我将运行64个工作项,最后三个工作项将只是“装死”


  • 为了不包含此检查,您必须使用工作组大小除以工作项总数。在这种情况下,您的工作组大小将为1(因为61是prime),这将非常缓慢

    越界访问是一个bug,需要消除,在大多数情况下它会降低执行速度越界访问是一个bug,需要消除,在大多数情况下它会降低执行速度谢谢!这让我明白了你的意思!这为我澄清了这一点
    kernel dp_square (const float *a,
    float *result, const unsigned int count)
    {
    int id = get_global_id(0);
    if(id < count)
        result[id] = a[id] * a[id];
    }