Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.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 为什么会有最大工作组大小的CL_设备?_Opencl - Fatal编程技术网

Opencl 为什么会有最大工作组大小的CL_设备?

Opencl 为什么会有最大工作组大小的CL_设备?,opencl,Opencl,我试图理解OpenCL设备(如GPU)的体系结构,但我不明白为什么本地工作组中的工作项数量有明确的界限,即恒定的CL_设备最大工作组大小 在我看来,这应该由编译器负责,即,如果(为简单起见,一维)内核以本地工作组大小500执行,而其物理最大值为100,并且内核看起来例如如下所示: __kernel void test(float* input) { i = get_global_id(0); someCode(i); barrier(); moreCode(i);

我试图理解OpenCL设备(如GPU)的体系结构,但我不明白为什么本地工作组中的工作项数量有明确的界限,即恒定的CL_设备最大工作组大小

在我看来,这应该由编译器负责,即,如果(为简单起见,一维)内核以本地工作组大小500执行,而其物理最大值为100,并且内核看起来例如如下所示:

__kernel void test(float* input) {
    i = get_global_id(0);
    someCode(i);
    barrier();
    moreCode(i);
    barrier();
    finalCode(i);
}
然后,它可以自动转换为此内核上工作组大小为100的执行:

__kernel void test(float* input) {
    i = get_global_id(0);
    someCode(5*i);
    someCode(5*i+1);
    someCode(5*i+2);
    someCode(5*i+3);
    someCode(5*i+4);
    barrier();
    moreCode(5*i);
    moreCode(5*i+1);
    moreCode(5*i+2);
    moreCode(5*i+3);
    moreCode(5*i+4);
    barrier();
    finalCode(5*i);
    finalCode(5*i+1);
    finalCode(5*i+2);
    finalCode(5*i+3);
    finalCode(5*i+4);
}

然而,这似乎不是默认的。为什么不呢?有没有办法使这个过程自动化(除了自己编写预编译器之外)?或者是有一个内在的问题会使我的方法在某些示例中失败(你能给我一个吗)?

编译器会从设备中查询这些常量,以便在编译时确定合适的工作组大小(编译当然是指编译内核)。我可能误解了你,但你似乎在考虑自己设定这些价值观,事实并非如此


您的代码负责查询要为其运行的任何硬件准备的系统功能。

我认为CL\u设备\u最大\u工作组\u大小的来源在于底层硬件实现

多个线程在计算单元上同时运行,每个线程都需要保持状态(对于call、jmp等)。大多数实现都使用堆栈来实现这一点,如果您查看AMD Evergreen系列,它们对可用堆栈项的数量有一个硬件限制(每个堆栈项都有子项)。这在本质上限制了每个计算单元可以同时处理的线程数量


至于编译器可以做到这一点,使之成为可能。它可以工作,但要理解这意味着要重新编译内核。这并不总是可能的。我可以想象这样的情况:开发人员以二进制格式转储每个平台的编译内核,并仅出于“不太开源”的原因将其与软件一起提供

它会把五个函数调用放在一个序列中,不是吗?所以这只是一种倒退。此外,您还必须确保将工作尺寸填充为5的倍数。只是想知道,对于二进制内核,..+1将是一个明确的限制因素。