У меня есть 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;
}
}
}";
}
}
Я также рад любому другому исполнению намекает! :)