2014-02-06 95 views
2

我從來不需要在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; 
} 

不過,我得到這些錯誤:

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*' 

如何讓指針在此代碼工作?再次,這是第一次在我使用C#的時候出現了指針。

+1

它似乎你的方法需要雙指針作爲第二個參數,但你傳遞一個雙數組。 –

回答

4

在Yeppp的方法!庫有兩個重載:一個採用數組+偏移量,另一個採用指針(例如,如果你想用stackalloc'ed內存調用它們)。例如。餘弦計算Yeppp!提供兩種重載:

這樣操作,你的例子應該寫成:

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

    Yeppp.Math.Cos_V64f_V64f(array, 0, result, 0, MAX_SIZE); 

    stopwatch.Stop(); 
    return stopwatch.ElapsedMilliseconds; 
} 

請注意,只有每個數組需要一次調用(即使您使用了指針)。

+0

很棒!謝謝 – user9993

+0

我應該補充@MarcinJuraszek答案是完全正確的,這就是陣列版本在內部實現的方式 –

5

您必須使用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; 
} 
+0

Bah ..對我來說太快了:P –