use*_*993 2 c# pointers simd yeppp
我之前从未需要在C#中使用指针,但是,我正在使用的库要求方法参数作为指针传递.该库允许使用SIMD指令集.
为了测试如何使用该库,我试图编写一种方法,该方法使用SIMD一次性计算数组中所有元素的余弦值.
这就是我所拥有的:
double[] ValuesToCalculate = new double[MAX_SIZE];
double[] CalculatedCosines = new double[MAX_SIZE];
long Result;
Result = CalculateCosineArray(ValuesToCalculate, CalculatedCosines);
public static long CalculateCosineArraySIMD(double[] array, double[] result)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < array.Length; i++)
{
Yeppp.Math.Cos_V64f_V64f(*array, result, MAX_SIZE);
}
stopwatch.Stop();
return stopwatch.ElapsedMilliseconds;
}
Run Code Online (Sandbox Code Playgroud)
但是,我收到这些错误:
The best overloaded method match for 'Yeppp.Math.Cos_V64f_V64f(double*, double*, int)' has some invalid arguments
Argument 1: cannot convert from 'double[]' to 'double*'
The * or -> operator must be applied to a pointer
Argument 2: cannot convert from 'double[]' to 'double*'
Run Code Online (Sandbox Code Playgroud)
如何获得在此代码中工作的指针?同样,这是我在使用C#时第一次出现指针.
你必须使用fixed语句从数组中获取指针.
可能是这样的:
public static long CalculateCosineArraySIMD(double[] array, double[] result)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
fixed (double* arrayPtr = array, resultPtr = result)
{
Yeppp.Math.Cos_V64f_V64f(arrayPtr, resultPtr, MAX_SIZE);
};
stopwatch.Stop();
return stopwatch.ElapsedMilliseconds;
}
Run Code Online (Sandbox Code Playgroud)