Skip to content

Commit 6c10ad6

Browse files
committed
Performance optimization for all binary operations to use Parallel.For
1 parent ebc7f0c commit 6c10ad6

File tree

10 files changed

+228
-496
lines changed

10 files changed

+228
-496
lines changed

src/NumSharp.Core/Backends/Default/Math/Default.Abs.cs

Lines changed: 10 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Threading.Tasks;
23
using DecimalMath;
34
using NumSharp.Utilities;
45

@@ -28,109 +29,75 @@ public override NDArray Abs(in NDArray nd, NPTypeCode? typeCode = null)
2829
case NPTypeCode.#1:
2930
{
3031
var out_addr = (#2*)@out.Address;
31-
for (int i = 0; i < len; i++)
32-
*(out_addr + i) = Converts.To#1(Math.Abs(*(out_addr + i)));
33-
32+
Parallel.For(0, len, i => *(out_addr + i) = Converts.To#1(Math.Abs(*(out_addr + i))));
3433
return @out;
3534
}
3635
%
3736
case NPTypeCode.Decimal:
3837
{
3938
var out_addr = (decimal*)@out.Address;
40-
for (int i = 0; i < len; i++)
41-
*(out_addr + i) = (DecimalEx.Abs(*(out_addr + i)));
42-
39+
Parallel.For(0, len, i => *(out_addr + i) = (DecimalEx.Abs(*(out_addr + i))));
4340
return @out;
4441
}
4542
default:
4643
throw new NotSupportedException();
4744
#else
4845
case NPTypeCode.Byte:
4946
{
50-
var out_addr = (byte*)@out.Address;
51-
for (int i = 0; i < len; i++)
52-
*(out_addr + i) = Converts.ToByte(Math.Abs(*(out_addr + i)));
53-
5447
return @out;
5548
}
5649
case NPTypeCode.Int16:
5750
{
5851
var out_addr = (short*)@out.Address;
59-
for (int i = 0; i < len; i++)
60-
*(out_addr + i) = Converts.ToInt16(Math.Abs(*(out_addr + i)));
61-
52+
Parallel.For(0, len, i => *(out_addr + i) = Converts.ToInt16(Math.Abs(*(out_addr + i))));
6253
return @out;
6354
}
6455
case NPTypeCode.UInt16:
6556
{
66-
var out_addr = (ushort*)@out.Address;
67-
for (int i = 0; i < len; i++)
68-
*(out_addr + i) = Converts.ToUInt16(Math.Abs(*(out_addr + i)));
69-
7057
return @out;
7158
}
7259
case NPTypeCode.Int32:
7360
{
7461
var out_addr = (int*)@out.Address;
75-
for (int i = 0; i < len; i++)
76-
*(out_addr + i) = Converts.ToInt32(Math.Abs(*(out_addr + i)));
77-
62+
Parallel.For(0, len, i => *(out_addr + i) = Converts.ToInt32(Math.Abs(*(out_addr + i))));
7863
return @out;
7964
}
8065
case NPTypeCode.UInt32:
8166
{
82-
var out_addr = (uint*)@out.Address;
83-
for (int i = 0; i < len; i++)
84-
*(out_addr + i) = Converts.ToUInt32(Math.Abs(*(out_addr + i)));
85-
8667
return @out;
8768
}
8869
case NPTypeCode.Int64:
8970
{
9071
var out_addr = (long*)@out.Address;
91-
for (int i = 0; i < len; i++)
92-
*(out_addr + i) = Converts.ToInt64(Math.Abs(*(out_addr + i)));
93-
72+
Parallel.For(0, len, i => *(out_addr + i) = Converts.ToInt64(Math.Abs(*(out_addr + i))));
9473
return @out;
9574
}
9675
case NPTypeCode.UInt64:
9776
{
98-
var out_addr = (ulong*)@out.Address;
99-
for (int i = 0; i < len; i++)
100-
*(out_addr + i) = Converts.ToUInt64(Math.Abs((double) *(out_addr + i)));
101-
10277
return @out;
10378
}
10479
case NPTypeCode.Char:
10580
{
10681
var out_addr = (char*)@out.Address;
107-
for (int i = 0; i < len; i++)
108-
*(out_addr + i) = Converts.ToChar(Math.Abs(*(out_addr + i)));
109-
82+
Parallel.For(0, len, i => *(out_addr + i) = Converts.ToChar(Math.Abs(*(out_addr + i))));
11083
return @out;
11184
}
11285
case NPTypeCode.Double:
11386
{
11487
var out_addr = (double*)@out.Address;
115-
for (int i = 0; i < len; i++)
116-
*(out_addr + i) = Converts.ToDouble(Math.Abs(*(out_addr + i)));
117-
88+
Parallel.For(0, len, i => *(out_addr + i) = Converts.ToDouble(Math.Abs(*(out_addr + i))));
11889
return @out;
11990
}
12091
case NPTypeCode.Single:
12192
{
12293
var out_addr = (float*)@out.Address;
123-
for (int i = 0; i < len; i++)
124-
*(out_addr + i) = Converts.ToSingle(Math.Abs(*(out_addr + i)));
125-
94+
Parallel.For(0, len, i => *(out_addr + i) = Converts.ToSingle(Math.Abs(*(out_addr + i))));
12695
return @out;
12796
}
12897
case NPTypeCode.Decimal:
12998
{
13099
var out_addr = (decimal*)@out.Address;
131-
for (int i = 0; i < len; i++)
132-
*(out_addr + i) = (DecimalEx.Abs(*(out_addr + i)));
133-
100+
Parallel.For(0, len, i => *(out_addr + i) = (DecimalEx.Abs(*(out_addr + i))));
134101
return @out;
135102
}
136103
default:

src/NumSharp.Core/Backends/Default/Math/Default.Cos.cs

Lines changed: 14 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Threading.Tasks;
23
using DecimalMath;
34
using NumSharp.Utilities;
45

@@ -25,18 +26,14 @@ public override NDArray Cos(in NDArray nd, NPTypeCode? typeCode = null)
2526
case NPTypeCode.#1:
2627
{
2728
var out_addr = (#2*)@out.Address;
28-
for (int i = 0; i < len; i++)
29-
*(out_addr + i) = Converts.To#1(Math.Cos(*(out_addr + i)));
30-
29+
Parallel.For(0, len, i => *(out_addr + i) = Converts.To#1(Math.Cos(*(out_addr + i))));
3130
return @out;
3231
}
3332
%
3433
case NPTypeCode.Decimal:
3534
{
3635
var out_addr = (decimal*)@out.Address;
37-
for (int i = 0; i < len; i++)
38-
*(out_addr + i) = (DecimalEx.Cos(*(out_addr + i)));
39-
36+
Parallel.For(0, len, i => *(out_addr + i) = (decimal)(Math.Cos(Converts.ToDouble(*(out_addr + i)))));
4037
return @out;
4138
}
4239
default:
@@ -45,89 +42,67 @@ public override NDArray Cos(in NDArray nd, NPTypeCode? typeCode = null)
4542
case NPTypeCode.Byte:
4643
{
4744
var out_addr = (byte*)@out.Address;
48-
for (int i = 0; i < len; i++)
49-
*(out_addr + i) = Converts.ToByte(Math.Cos(*(out_addr + i)));
50-
45+
Parallel.For(0, len, i => *(out_addr + i) = Converts.ToByte(Math.Cos(*(out_addr + i))));
5146
return @out;
5247
}
5348
case NPTypeCode.Int16:
5449
{
5550
var out_addr = (short*)@out.Address;
56-
for (int i = 0; i < len; i++)
57-
*(out_addr + i) = Converts.ToInt16(Math.Cos(*(out_addr + i)));
58-
51+
Parallel.For(0, len, i => *(out_addr + i) = Converts.ToInt16(Math.Cos(*(out_addr + i))));
5952
return @out;
6053
}
6154
case NPTypeCode.UInt16:
6255
{
6356
var out_addr = (ushort*)@out.Address;
64-
for (int i = 0; i < len; i++)
65-
*(out_addr + i) = Converts.ToUInt16(Math.Cos(*(out_addr + i)));
66-
57+
Parallel.For(0, len, i => *(out_addr + i) = Converts.ToUInt16(Math.Cos(*(out_addr + i))));
6758
return @out;
6859
}
6960
case NPTypeCode.Int32:
7061
{
7162
var out_addr = (int*)@out.Address;
72-
for (int i = 0; i < len; i++)
73-
*(out_addr + i) = Converts.ToInt32(Math.Cos(*(out_addr + i)));
74-
63+
Parallel.For(0, len, i => *(out_addr + i) = Converts.ToInt32(Math.Cos(*(out_addr + i))));
7564
return @out;
7665
}
7766
case NPTypeCode.UInt32:
7867
{
7968
var out_addr = (uint*)@out.Address;
80-
for (int i = 0; i < len; i++)
81-
*(out_addr + i) = Converts.ToUInt32(Math.Cos(*(out_addr + i)));
82-
69+
Parallel.For(0, len, i => *(out_addr + i) = Converts.ToUInt32(Math.Cos(*(out_addr + i))));
8370
return @out;
8471
}
8572
case NPTypeCode.Int64:
8673
{
8774
var out_addr = (long*)@out.Address;
88-
for (int i = 0; i < len; i++)
89-
*(out_addr + i) = Converts.ToInt64(Math.Cos(*(out_addr + i)));
90-
75+
Parallel.For(0, len, i => *(out_addr + i) = Converts.ToInt64(Math.Cos(*(out_addr + i))));
9176
return @out;
9277
}
9378
case NPTypeCode.UInt64:
9479
{
9580
var out_addr = (ulong*)@out.Address;
96-
for (int i = 0; i < len; i++)
97-
*(out_addr + i) = Converts.ToUInt64(Math.Cos(*(out_addr + i)));
98-
81+
Parallel.For(0, len, i => *(out_addr + i) = Converts.ToUInt64(Math.Cos(*(out_addr + i))));
9982
return @out;
10083
}
10184
case NPTypeCode.Char:
10285
{
10386
var out_addr = (char*)@out.Address;
104-
for (int i = 0; i < len; i++)
105-
*(out_addr + i) = Converts.ToChar(Math.Cos(*(out_addr + i)));
106-
87+
Parallel.For(0, len, i => *(out_addr + i) = Converts.ToChar(Math.Cos(*(out_addr + i))));
10788
return @out;
10889
}
10990
case NPTypeCode.Double:
11091
{
11192
var out_addr = (double*)@out.Address;
112-
for (int i = 0; i < len; i++)
113-
*(out_addr + i) = Converts.ToDouble(Math.Cos(*(out_addr + i)));
114-
93+
Parallel.For(0, len, i => *(out_addr + i) = Converts.ToDouble(Math.Cos(*(out_addr + i))));
11594
return @out;
11695
}
11796
case NPTypeCode.Single:
11897
{
11998
var out_addr = (float*)@out.Address;
120-
for (int i = 0; i < len; i++)
121-
*(out_addr + i) = Converts.ToSingle(Math.Cos(*(out_addr + i)));
122-
99+
Parallel.For(0, len, i => *(out_addr + i) = Converts.ToSingle(Math.Cos(*(out_addr + i))));
123100
return @out;
124101
}
125102
case NPTypeCode.Decimal:
126103
{
127104
var out_addr = (decimal*)@out.Address;
128-
for (int i = 0; i < len; i++)
129-
*(out_addr + i) = (DecimalEx.Cos(*(out_addr + i)));
130-
105+
Parallel.For(0, len, i => *(out_addr + i) = (decimal)(Math.Cos(Converts.ToDouble(*(out_addr + i)))));
131106
return @out;
132107
}
133108
default:

src/NumSharp.Core/Backends/Default/Math/Default.Cosh.cs

Lines changed: 15 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using System;
2+
using System.Threading.Tasks;
23
using NumSharp.Utilities;
4+
35
namespace NumSharp.Backends
46
{
57
public partial class DefaultEngine
@@ -23,18 +25,14 @@ public override NDArray Cosh(in NDArray nd, NPTypeCode? typeCode = null)
2325
case NPTypeCode.#1:
2426
{
2527
var out_addr = (#2*)@out.Address;
26-
for (int i = 0; i < len; i++)
27-
*(out_addr + i) = Converts.To#1(Math.Cosh(*(out_addr + i)));
28-
28+
Parallel.For(0, len, i => *(out_addr + i) = Converts.To#1(Math.Cosh(*(out_addr + i))));
2929
return @out;
3030
}
3131
%
3232
case NPTypeCode.Decimal:
3333
{
3434
var out_addr = (decimal*)@out.Address;
35-
for (int i = 0; i < len; i++)
36-
*(out_addr + i) = (decimal)(Math.Cosh(Converts.ToDouble(*(out_addr + i))));
37-
35+
Parallel.For(0, len, i => *(out_addr + i) = (decimal)(Math.Cosh(Converts.ToDouble(*(out_addr + i)))));
3836
return @out;
3937
}
4038
default:
@@ -43,89 +41,67 @@ public override NDArray Cosh(in NDArray nd, NPTypeCode? typeCode = null)
4341
case NPTypeCode.Byte:
4442
{
4543
var out_addr = (byte*)@out.Address;
46-
for (int i = 0; i < len; i++)
47-
*(out_addr + i) = Converts.ToByte(Math.Cosh(*(out_addr + i)));
48-
44+
Parallel.For(0, len, i => *(out_addr + i) = Converts.ToByte(Math.Cosh(*(out_addr + i))));
4945
return @out;
5046
}
5147
case NPTypeCode.Int16:
5248
{
5349
var out_addr = (short*)@out.Address;
54-
for (int i = 0; i < len; i++)
55-
*(out_addr + i) = Converts.ToInt16(Math.Cosh(*(out_addr + i)));
56-
50+
Parallel.For(0, len, i => *(out_addr + i) = Converts.ToInt16(Math.Cosh(*(out_addr + i))));
5751
return @out;
5852
}
5953
case NPTypeCode.UInt16:
6054
{
6155
var out_addr = (ushort*)@out.Address;
62-
for (int i = 0; i < len; i++)
63-
*(out_addr + i) = Converts.ToUInt16(Math.Cosh(*(out_addr + i)));
64-
56+
Parallel.For(0, len, i => *(out_addr + i) = Converts.ToUInt16(Math.Cosh(*(out_addr + i))));
6557
return @out;
6658
}
6759
case NPTypeCode.Int32:
6860
{
6961
var out_addr = (int*)@out.Address;
70-
for (int i = 0; i < len; i++)
71-
*(out_addr + i) = Converts.ToInt32(Math.Cosh(*(out_addr + i)));
72-
62+
Parallel.For(0, len, i => *(out_addr + i) = Converts.ToInt32(Math.Cosh(*(out_addr + i))));
7363
return @out;
7464
}
7565
case NPTypeCode.UInt32:
7666
{
7767
var out_addr = (uint*)@out.Address;
78-
for (int i = 0; i < len; i++)
79-
*(out_addr + i) = Converts.ToUInt32(Math.Cosh(*(out_addr + i)));
80-
68+
Parallel.For(0, len, i => *(out_addr + i) = Converts.ToUInt32(Math.Cosh(*(out_addr + i))));
8169
return @out;
8270
}
8371
case NPTypeCode.Int64:
8472
{
8573
var out_addr = (long*)@out.Address;
86-
for (int i = 0; i < len; i++)
87-
*(out_addr + i) = Converts.ToInt64(Math.Cosh(*(out_addr + i)));
88-
74+
Parallel.For(0, len, i => *(out_addr + i) = Converts.ToInt64(Math.Cosh(*(out_addr + i))));
8975
return @out;
9076
}
9177
case NPTypeCode.UInt64:
9278
{
9379
var out_addr = (ulong*)@out.Address;
94-
for (int i = 0; i < len; i++)
95-
*(out_addr + i) = Converts.ToUInt64(Math.Cosh(*(out_addr + i)));
96-
80+
Parallel.For(0, len, i => *(out_addr + i) = Converts.ToUInt64(Math.Cosh(*(out_addr + i))));
9781
return @out;
9882
}
9983
case NPTypeCode.Char:
10084
{
10185
var out_addr = (char*)@out.Address;
102-
for (int i = 0; i < len; i++)
103-
*(out_addr + i) = Converts.ToChar(Math.Cosh(*(out_addr + i)));
104-
86+
Parallel.For(0, len, i => *(out_addr + i) = Converts.ToChar(Math.Cosh(*(out_addr + i))));
10587
return @out;
10688
}
10789
case NPTypeCode.Double:
10890
{
10991
var out_addr = (double*)@out.Address;
110-
for (int i = 0; i < len; i++)
111-
*(out_addr + i) = Converts.ToDouble(Math.Cosh(*(out_addr + i)));
112-
92+
Parallel.For(0, len, i => *(out_addr + i) = Converts.ToDouble(Math.Cosh(*(out_addr + i))));
11393
return @out;
11494
}
11595
case NPTypeCode.Single:
11696
{
11797
var out_addr = (float*)@out.Address;
118-
for (int i = 0; i < len; i++)
119-
*(out_addr + i) = Converts.ToSingle(Math.Cosh(*(out_addr + i)));
120-
98+
Parallel.For(0, len, i => *(out_addr + i) = Converts.ToSingle(Math.Cosh(*(out_addr + i))));
12199
return @out;
122100
}
123101
case NPTypeCode.Decimal:
124102
{
125103
var out_addr = (decimal*)@out.Address;
126-
for (int i = 0; i < len; i++)
127-
*(out_addr + i) = (decimal)(Math.Cosh(Converts.ToDouble(*(out_addr + i))));
128-
104+
Parallel.For(0, len, i => *(out_addr + i) = (decimal)(Math.Cosh(Converts.ToDouble(*(out_addr + i)))));
129105
return @out;
130106
}
131107
default:

0 commit comments

Comments
 (0)