假设您提供的维度是数据的大小,您可以通过让每个 GPU 线程计算更多数据来减小全局工作大小。我的意思是,你的情况下的每个线程都会做一个计算,如果你改变你的内核来做 y 维度的 2 个计算,那么你可以将你正在触发的线程数减半。 global_work_size 决定了您在每个方向上执行的线程数。举个例子吧:
假设您有一个要进行一些计算的数组,并且您拥有的数组大小为 2048。如果您按以下方式编写内核,您将需要 2048 作为 global_work_size:
__kernel void calc (__global int *A, __global int *B)
{
int i = get_global_id(0);
B[i] = A[i] * 5;
}
在这种情况下,全局工作大小将是:
size_t global_work_size = {2048, 1, 1};
但是,如果您将内核更改为以下内核,您也可以降低全局工作大小:()
__kernel void new_calc (__global int *A, __global int *B)
{
int i = get_global_id(0);
for (int ind = 0; ind < 8; ind++)
B[i*8 + ind] = A[i*8 + ind] * 5;
}
那么这样,你可以使用全局大小为:
size_t global_work_size = {256, 1, 1};
同样使用第二个内核,您的每个线程将执行更多工作,从而提高利用率。