1

我有一个(在二维空间DictionaryCircles随机分布)和一个Position在二维空间中。该方法应该只返回任何圆,其中位置在圆的半径内。(可能不止一个,但我不在乎它选择哪一个)

我当前的实现如下所示:

int GetAnyCircleWithinRadius(Dictionary<int, Circle>circles, Position position)
{
    int circleIndex = -1;
    Parallel.ForEach(circles.Values, (circle, state) =>
    {
        double deltaX = cirlce.center.x - position.x;
        double deltaY = cirlce.center.x - position.x;
        double distance = Math.Abs(deltaX * deltaX + deltaY * deltaY);
        if (distance < circle.radius)
        {
            state.Break();
            circleIndex = circle.index;
        }
    }
    return circleIndex;
}

基本上,它在 CPU 上并行遍历所有圆,并检查到中心的距离是否小于其半径,这意味着该位置在圆内。

现在我的问题是:
有没有一种简单的方法,可以在 GPU 而不是 CPU 上运行相同的例程?

到目前为止,我尝试过的有点玩弄Cloo,我能够运行一个素数搜索器(见下文),但我不知道如何在这个程序中翻译我自己的“圆圈问题”-C# 代码。

using Cloo.Extensions;

...

static void Main(string[] args)
{
    primes.ClooForEach(IsPrime);
}

static string IsPrime
{
    get
    {
        return
            @"
            kernel void GetIfPrime(global int* message)
            {
                int index = get_global_id(0);
                int upperl = (int)sqrt((float)message[index]);
                for(int i = 2; i <= upperl; i++)
                {
                    if(message[index]%i==0)
                    {
                        message[index]=0;
                        return;
                    }
                }
            }";
    }
}

我也很高兴收到任何其他性能提示!:)

4

0 回答 0