我有一个(在二维空间Dictionary
中Circles
随机分布)和一个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;
}
}
}";
}
}
我也很高兴收到任何其他性能提示!:)