如何解决C#提高SIMD Sum的性能
我正在编写SIMD库,并尝试压缩所有性能。
我已经将> df[[752]] %>% ungroup() %>% data.frame() %>% class()
[1] "data.frame"
> df[[752]] %>% ungroup() %>% data.frame() %>% colnames()
[1] "leg.id" "arb_identifier" "SecurityID" "date" "UnderlyingClose" "UnderlyingOpen"
[7] "TotalReturn" "ReferenceExchange" "OptionID" "Expiration" "CallPut" "Strike"
[13] "Volume" "OpenInterest" "ImpliedVolatility" "Delta" "Gamma" "Vega"
[19] "Theta" "AdjustmentFactor" "BestBid" "BestOffer" "Last" "LastTradeDate"
[25] "T" "stale" "old" "roll" "n_opt_shares" "delta.hedge"
[31] "OrigBid" "OrigOffer" "PXRecov" "acquisition_date" "tranche_id"
> df[[752]] %>% ungroup() %>% data.frame() %>% NROW()
[1] 1
投射到array
中,而不是创建新对象。
目标数组很大(超过1000个元素)。
有没有更有效的数组求和方式?
欢迎提出想法。
Span<Vector<int>>
解决方法
您的代码是好的。只能提高4%,方法如下:
// Test result: only 4% win on my PC.
[MethodImpl( MethodImplOptions.AggressiveInlining )]
static int sumUnsafeAvx2( int[] array )
{
unsafe
{
fixed( int* sourcePointer = array )
{
int* pointerEnd = sourcePointer + array.Length;
int* pointerEndAligned = sourcePointer + ( array.Length - array.Length % 16 );
Vector256<int> sumLow = Vector256<int>.Zero;
Vector256<int> sumHigh = sumLow;
int* pointer;
for( pointer = sourcePointer; pointer < pointerEndAligned; pointer += 16 )
{
var a = Avx.LoadVector256( pointer );
var b = Avx.LoadVector256( pointer + 8 );
sumLow = Avx2.Add( sumLow,a );
sumHigh = Avx2.Add( sumHigh,b );
}
sumLow = Avx2.Add( sumLow,sumHigh );
Vector128<int> res4 = Sse2.Add( sumLow.GetLower(),sumLow.GetUpper() );
res4 = Sse2.Add( res4,Sse2.Shuffle( res4,0x4E ) );
res4 = Sse2.Add( res4,1 ) );
int scalar = res4.ToScalar();
for( ; pointer < pointerEnd; pointer++ )
scalar += *pointer;
return scalar;
}
}
}
为清楚起见,我不建议您做上面写的事情。不适用于4%的改善。不安全的代码是不安全的。您的版本可以在没有AVX2的情况下运行,并且可以从AVX512获得好处,如果没有AVX2,我的优化版本将会崩溃,即使硬件支持,也不会使用AVX512。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。