Обнаружение коллизий на GPU в C# - PullRequest
1 голос
/ 02 августа 2020

У меня есть Dictionary из Circles (случайное распределение в 2D-пространстве) и Position в 2D-пространстве. Метод должен возвращать только ЛЮБОЙ круг, где Позиция находится в пределах радиуса круга. (Их может быть даже больше, чем один, но меня не волнует, какой из них он выберет)

Моя текущая реализация выглядит так:

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;
}

В основном он проходит через все круги в параллельно на ЦП и проверяет, меньше ли расстояние до центра, чем его радиус, что означало бы, что позиция находится внутри круга.

Теперь мой вопрос:
Есть ли простой способ запустить ту же процедуру на графическом процессоре вместо процессора? ниже), но я понятия не имею, как я могу перевести свою собственную "круговую задачу" - 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;
                    }
                }
            }";
    }
}

Я также рад любому другому исполнению намекает! :)

...