【发布时间】:2019-10-02 07:10:56
【问题描述】:
我第一次尝试使用opencl,目标是计算数组中每一行的argmin。由于每一行的操作都是独立的,所以我认为这很容易放在显卡上。
使用此代码的性能似乎比我仅使用外部 forloop 在 cpu 上运行代码时获得的性能更差,任何帮助将不胜感激。
代码如下:
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
int argmin(global double *array, int end)
{
double minimum = array[0];
int index;
for (int j = 0; j < end; j++)
{
if (array[j] < minimum)
{
minimum = array[j];
index = j;
}
}
return index;
}
kernel void execute(global double *dist, global long *res, global double *min_dist)
{
int row_size = 0;
int i = get_global_id(0);
int row_index = i * row_size;
res[i] = argmin(&dist[row_index], row_size);
min_dist[i] = dist[res[i] + row_index];
}
【问题讨论】:
-
“我的表现似乎变差了。”为什么不添加一些关于执行时间的信息(也许你的硬件)?并且“常规for循环”意味着cpu上的“相同”实现只是使用外部for循环而不是gpu上的线程?关于性能,我会说访问模式对 gpu 来说真的很糟糕。以列为主的顺序会更好。参见例如this question.
-
如果你的 opencl 设备是一个独立的 GPU,那么我并不奇怪你的性能会变差。您的内核是微不足道的,总运行时间主要是传输数据的开销。 CPU 和 iGPU 不需要传输任何数据,但独立 GPU 需要,而且通过 PCIe 的传输速度相对较慢。除非它是更大计算的一部分,否则在离散 GPU 上运行此代码确实没有意义。