我是OpenCL中的新手,考虑到所有GPU执行后果让我有问题。我正在尝试编写总结,所以我有2D点,需要计算" gravity"在他们之间行动的力量。我对OpenCL内核的最好看法是这样的:
kernel void ker_fun(global const double* pts, uint pts_size, global double* fxs, global double* fys, double vertexRepulsion)
{
double x=pts[2*get_global_id(0)];
double y=pts[2*get_global_id(0)+1];
double fx=0;
double fy=0;
for (size_t i=get_global_id(0)+1; i<pts_size; ++i) {
double dx=x-pts[2*i]; // point[i] -> points[THIS]
double dy=y-pts[2*i+1];
double r2=pow(dx, 2)+pow(dy, 2);
r2=max(r2, 0.0001); // to prevent (r2==0) issue
double f=gravityConstant/r2;
double ratio=f/sqrt(r2);
dx*=ratio;
dy*=ratio;
fx+=dx;
fy+=dy;
atomic_add_double(&fxs[i], -dx);
atomic_add_double(&fys[i], -dy);
}
atomic_add_double(&fxs[get_global_id(0)], fx);
atomic_add_double(&fys[get_global_id(0)], fy);
其中fxs
和fys
是X和X方向的强制值(即我的结果),atomic_add_double
函数是从此站点复制的(OpenCL - using atomic reduction for double)。
此功能可以工作并计算出所需的结果。但它很慢。你能告诉我,如何做到这种不同的更好的方式。
谢谢您的时间和帮助