【问题标题】:new vector using .Net System.Numeric fills only half of the vector length使用 .Net System.Numeric 的新向量仅填充向量长度的一半
【发布时间】:2019-09-03 06:22:15
【问题描述】:

我正在做一个数字过滤器并使用向量和 SIMD 指令使其更快,但在调试过程中我注意到当创建一个新向量时它只初始化向量中的一半项目,例如在创建一个长度为 8 的向量,只有向量的前 4 个项目有值,其余的将为 0,即使用于创建具有 31 个项目的向量的数组,都不同于 0。这导致过滤器使用只有一半的系数和一半的数据。

相关代码如下。

var simdLength = Vector<float>.Count;
var leftOver = m_filterSize % simdLength;
    for (int i = 0; i < m_filterSize - leftOver; i += simdLength)
    {
        var filterVector = new Vector<float>(m_filter, i);
        var dataVector = new Vector<float>(data, i);
        filteredValueVector += filterVector * dataVector;
    }

处理剩下的部分之后有一些代码,但它不是向量并且可以正常工作。

【问题讨论】:

  • 这只是调试器视图...您的数据仍然存在
  • 不,我只是做了一个测试,在问题的代码之后用相同的值和答案不同的代码做同样的数学而不是向量化,所以看起来向量真的初始化不正确跨度>
  • 我也遇到过这个问题。我在 64 位窗口上运行最新的 .NET Core 3.1。我使用Vector&lt;float&gt;.One,返回的Vector包含8个条目,但只有前4个元素设置为1。其余设置为0。
  • 没关系,它确实只是调试器:github.com/dotnet/runtime/issues/9688 计算差异是由于矢量化代码中其他地方的错误造成的。
  • 在 VS 2019 中使用 .NET 5.0 也会影响我

标签: c# .net simd visual-studio-debugging system.numerics


【解决方案1】:

这是一个调试器错误:

int capacity = Vector<float>.Count;
float[] testVals = Enumerable.Range(0, capacity).Select(i => (float)i).ToArray();
Vector<float> testV = new(testVals);
float[] returnedVals = Enumerable.Range(0, capacity).Select(i => testV[i]).ToArray();

有趣的是,string.Join 总是根据自己的选择格式化你的向量:

Vector<int> powersOfTwo = new Vector<int>(Enumerable.Range(0, Vector<int>.Count).Select(i => 1 << i).ToArray());
string powersOfTwoString = string.Join("abc", powersOfTwo);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    相关资源
    最近更新 更多