C# 计算两两坐标之间的距离(SIMD加速)

问题描述:对于Point\[\] points坐标数组(Point是坐标点,包含X与Y),请计算两两坐标点之间的距离。

思路:既然是算距离,没有别的要求,只需要最简单的曼哈顿距离就行。

测试数据:

cs 复制代码
Random random = new Random();
int n = 3000;
Point[] points = new Point[n];
for (int i = 0; i < n; i++)
{
    points[i] = new Point(random.Next(10), random.Next(10));
}

方法一:采用普通遍历法

cs 复制代码
Stopwatch sw = Stopwatch.StartNew();
int m = (n * n - n) / 2;
List<int> list2 = new List<int>(m);
for (int i = 0; i < n; i++)
{
    Point p= points[i];
    for (int j = i + 1; j < n; j++)
    {
        Point p2 = points[j];
        int dif = Math.Abs(p.X - p2.X) + Math.Abs(p.Y - p2.Y);
        list2.Add(dif);
    }
}
sw.Stop();
Console.WriteLine($"普通耗时:{sw.ElapsedMilliseconds}ms");

方法二:采用SIMD加速

cs 复制代码
 public static int[] CalculateDistance(Point[] points)
        {
            int n = points.Length;
            int m = (n * n - n) >> 1;
            int[] ints = new int[m];
            int k = 0;
            if (n <= 4)// 如果数据量小于等于4采用指针处理
            {
                fixed (Point* ptr = points)
                {
                    for (int i = 0; i < n; i++)
                    {
                        Point* p1 = ptr + i;
                        for (int j = i + 1; j < n; j++)
                        {
                            Point* p2 = ptr + j;
                            int dif = Math.Abs(p1->X - p2->X) + Math.Abs(p1->Y - p2->Y);
                            ints[k++] = dif;
                        }
                    }
                    return ints;
                }
            }
            int vsize = Vector128<int>.Count;
            int t = 0;
            int[] xs = new int[n];
            int[] ys = new int[n];
            fixed (Point* ptr = points)
            {
                fixed (int* xptr = xs, yptr = ys, rptr = ints)
                {
                    // 分离x与y
                    for (int i = 0; i < n; i++)
                    {
                        Point* p = ptr + i;
                        *(xptr + i) = p->X;
                        *(yptr + i) += p->Y;
                    }
                    // 开始向量计算
                    for (int i = 0; i < n; i += vsize)
                    {
                        Vector128<int> vx1 = *(Vector128<int>*)(xptr + i);
                        Vector128<int> vy1 = *(Vector128<int>*)(yptr + i);
                        for (int j = i + 1; j < n; j++)
                        {
                            Vector128<int> vx2 = *(Vector128<int>*)(xptr + j);
                            Vector128<int> vy2 = *(Vector128<int>*)(yptr + j);
                            // 向量运算
                            var vDifference = Sse2.Add(Vector128.Abs(Sse2.Subtract(vx1, vx2)), Vector128.Abs(Sse2.Subtract(vy1, vy2)));
                            int* maskPtr = (int*)&vDifference;
                            int h = n - j;
                            for (int a = 0; a < vsize; a++)
                            {
                                if (a >= h) break;
                                *(rptr + t++) = *(maskPtr + a);
                            }
                        }
                    }
                }
            }
            return ints;
        }

注:根据CPU选择合适的Vector,比如Vector256、Vector512等等。本文只用Vector128.

测试结果(Release环境):

|----------|------|------|------|-------|-------|
| 数据量 | 3000 | 5000 | 7000 | 10000 | 30000 |
| 普通耗时(ms) | 43 | 127 | 211 | 538 | 3872 |
| 向量耗时(ms) | 19 | 56 | 68 | 190 | 1092 |

结论:明显向量运算性能优于普通计算。

相关推荐
@yanyu66611 分钟前
C编译器安装与第一个C程序
c语言·开发语言
落魄实习生23 分钟前
Agent Scope Java 2.x 系列【2】 ReActAgent
java·开发语言
智鸟科技GemeOpen开发者智能设备33 分钟前
智能插座二次开发如何接入Home Assistant,从零开始完整工程实现(Python+React)
开发语言·python·物联网·react.js·智能家居
疯狂成瘾者34 分钟前
海康 Artemis 接口对接
开发语言·lua
2601_962218611 小时前
C++中decltype关键字的实现
开发语言·c++
hqyjzsb1 小时前
法律 Prompt 干货:搭建合同审查提示词要包含哪些要素
开发语言·人工智能·python·职场和发展·数据分析·prompt·业界资讯
孙启超1 小时前
【AI开发之Rust】第 19 课:UniFFI 导出核心能力
开发语言·后端·rust
2601_966949651 小时前
股票池发生变化后,如何高效更新行情数据?从全量刷新到增量同步
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
繁华的地方不一定留下你的脚印1 小时前
C++ std::variant 与 std::visit:安全保存多种类型,写清每个处理分支
开发语言·c++
小羊没烦恼!2 小时前
在Scrum中实施敏捷建模
java·开发语言·windows·算法·c#