当前位置:   article > 正文

C# 使用Vector256写了一个简单的帮助类Vector256Helper

C# 使用Vector256写了一个简单的帮助类Vector256Helper

 当数据量大的时候用普通代码计算非常耗时,这里简单利用simd加速处理

  1. internal unsafe class Vector256Helper
  2. {
  3. /// <summary>
  4. /// 统计元素个数
  5. /// </summary>
  6. /// <param name="array"></param>
  7. /// <param name="elementToCount">需要统计的元素</param>
  8. /// <returns></returns>
  9. public static int Count(int[] array, int elementToCount)
  10. {
  11. int count = 0;
  12. int vectorSize = Vector256<int>.Count;
  13. int limit = array.Length - (array.Length % vectorSize);
  14. fixed (int* pArray = array)
  15. {
  16. int* ptr = pArray;
  17. var target = Vector256.Create(elementToCount);
  18. Vector256<int> equalMask = Vector256<int>.Zero;
  19. for (int i = 0; i < limit; i += vectorSize)
  20. {
  21. Vector256<int> vector = Avx.LoadVector256(ptr + i);
  22. equalMask += Avx2.CompareEqual(vector, target);
  23. }
  24. int* equalMaskPtr = (int*)&equalMask;
  25. for (int j = 0; j < vectorSize; j++)
  26. {
  27. count += -*(equalMaskPtr + j);
  28. }
  29. // 处理剩余的元素
  30. for (int i = limit; i < array.Length; i++)
  31. {
  32. if (*(pArray + i) == elementToCount)
  33. count++;
  34. }
  35. }
  36. return count;
  37. }
  38. /// <summary>
  39. /// 求和
  40. /// </summary>
  41. /// <param name="buffer"></param>
  42. /// <returns></returns>
  43. public static int Sum(int[] buffer)
  44. {
  45. int vectorSize = Vector256<int>.Count;
  46. int sum4 = 0;
  47. Vector256<int> sumV = Vector256<int>.Zero;
  48. int j;
  49. int m = buffer.Length - vectorSize;
  50. fixed (int* p = buffer)
  51. {
  52. for (j = 0; j <= m; j += vectorSize)
  53. {
  54. sumV += Avx2.LoadVector256(p + j);
  55. }
  56. int* ptr = (int*)&sumV;
  57. for (int i = 0; i < vectorSize; i++)
  58. {
  59. sum4 += *(ptr + i);
  60. }
  61. // 处理剩余的元素
  62. for (; j < buffer.Length; j++)
  63. {
  64. sum4 += *(p + j);
  65. }
  66. }
  67. return sum4;
  68. }
  69. /// <summary>
  70. /// 求平均数
  71. /// </summary>
  72. /// <param name="buffer"></param>
  73. /// <returns></returns>
  74. public double Avg(int[] buffer)
  75. {
  76. int sum = Sum(buffer);
  77. return sum / (double)buffer.Length;
  78. }
  79. /// <summary>
  80. /// 求最大值
  81. /// </summary>
  82. /// <param name="array"></param>
  83. /// <returns></returns>
  84. public static int Max(int[] array)
  85. {
  86. int vectorSize = Vector256<int>.Count;
  87. int limit = array.Length - (array.Length % vectorSize);
  88. fixed (int* pArray = array)
  89. {
  90. int maxElement = *pArray;
  91. Vector256<int> vectorMax = Avx2.LoadVector256(pArray);
  92. for (int i = 1; i < limit; i += vectorSize)
  93. {
  94. Vector256<int> vector = Avx2.LoadVector256(pArray + i);
  95. vectorMax = Avx2.Max(vectorMax, vector);
  96. }
  97. int* maxPtr = (int*)&vectorMax;
  98. for (int j = 0; j < vectorSize; j++)
  99. {
  100. maxElement = Math.Max(maxElement, *(maxPtr + j));
  101. }
  102. for (int i = limit; i < array.Length; i++)
  103. {
  104. maxElement = Math.Max(maxElement, *(pArray + i));
  105. }
  106. return maxElement;
  107. }
  108. }
  109. /// <summary>
  110. /// 求最小值
  111. /// </summary>
  112. /// <param name="array"></param>
  113. /// <returns></returns>
  114. public static int Min(int[] array)
  115. {
  116. int vectorSize = Vector256<int>.Count;
  117. int limit = array.Length - (array.Length % vectorSize);
  118. fixed (int* pArray = array)
  119. {
  120. int maxElement = *pArray;
  121. Vector256<int> vectorMin = Avx2.LoadVector256(pArray);
  122. for (int i = 1; i < limit; i += vectorSize)
  123. {
  124. Vector256<int> vector = Avx2.LoadVector256(pArray + i);
  125. vectorMin = Avx2.Min(vectorMin, vector);
  126. }
  127. int* maxPtr = (int*)&vectorMin;
  128. for (int j = 0; j < vectorSize; j++)
  129. {
  130. maxElement = Math.Min(maxElement, *(maxPtr + j));
  131. }
  132. for (int i = limit; i < array.Length; i++)
  133. {
  134. maxElement = Math.Min(maxElement, *(pArray + i));
  135. }
  136. return maxElement;
  137. }
  138. }
  139. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/746061
推荐阅读
相关标签
  

闽ICP备14008679号