メモ
・サーバー側はMBaaS(Mobile Backend as a Service)というのを利用するのがよさそう。parseというのがよさそう。
https://qiita.com/kazu0620/items/20ea8cd1c3a2e3bb5574
・parseについて
https://dev.classmethod.jp/cloud/parse-introduction-1/
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)・x_trainとt_trainは訓練用の画像(の配列)と、正解を表す数字(の配列)が入っていて、

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TestParallel
{
class Program
{
//-------------------------------
//ここはテストコードを呼び出しているだけなので重要でないです。
//-------------------------------
static void Main(string[] args)
{
// 時間測定用
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
// 本体
double pi = SerialPi();
Console.WriteLine("--- シリアル ---");
Console.WriteLine("答え:" + pi.ToString("R"));
//時間測定用
sw.Stop();
Console.WriteLine("時間:"+ sw.Elapsed);
sw.Restart();
// 本体
double npi = NaiveParallelPi();
Console.WriteLine("--- パラレル( よくない ) ---");
Console.WriteLine("答え:" + npi.ToString("R"));
//時間測定用
sw.Stop();
Console.WriteLine("時間:" + sw.Elapsed);
sw.Restart();
// 本体
double ppi = ParallelPi();
Console.WriteLine("--- パラレル( よい )---");
Console.WriteLine("答え:" + ppi.ToString("R"));
//時間測定用
sw.Stop();
Console.WriteLine("時間:" + sw.Elapsed);
// getchar
Console.ReadKey();
}
const long NUM_STEPS = 500000000;
//-------------------------------
//シリアルで計算 (単純なfor文)
//-------------------------------
static double SerialPi()
{
double sum = 0.0;
double step = 1.0 / (double)NUM_STEPS;
for (long i = 0; i < NUM_STEPS; i++)
{
double x = (i + 0.5) * step;
double partial = 4.0 / (1.0 + x * x);
sum += partial;
}
return step * sum;
}
//-------------------------------
//パラレルで計算 (よくない)
//-------------------------------
static double NaiveParallelPi()
{
double sum = 0.0;
double step = 1.0 / (double)NUM_STEPS;
object obj = new object();
Parallel.For(0, NUM_STEPS, i =>
{
double x = (i + 0.5) * step;
double partial = 4.0 / (1.0 + x * x);
lock (obj) sum += partial;
});
return step * sum;
}
//-------------------------------
//パラレルで計算 (よい)
//-------------------------------
static double ParallelPi()
{
double sum = 0.0;
double step = 1.0 / (double)NUM_STEPS;
object obj = new object();
Parallel.For(0,
NUM_STEPS,
() => 0.0,
(i, state, partial) =>
{
double x = (i + 0.5) * step;
return partial + 4.0 / (1.0 + x * x);
},
partial => { lock (obj) sum += partial; });
return step * sum;
}
}
}