3

我正在做一个数字过滤器并使用向量和 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;
    }

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

4

1 回答 1

3

这是一个调试器错误:

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);

在此处输入图像描述

于 2021-12-17T06:54:43.173 回答