OpenCL快速迭代所有对

时间:2018-04-21 22:45:52

标签: opencl gpu gpu-programming

我是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);

其中fxsfys是X和X方向的强制值(即我的结果),atomic_add_double函数是从此站点复制的(OpenCL - using atomic reduction for double)。

此功能可以工作并计算出所需的结果。但它很慢。你能告诉我,如何做到这种不同的更好的方式。

谢谢您的时间和帮助

0 个答案:

没有答案