private void RunYcsb(int thread_idx) { RandomGenerator rng = new RandomGenerator((uint)(1 + thread_idx)); if (numaStyle == 0) { Native32.AffinitizeThreadRoundRobin((uint)thread_idx); } else { Native32.AffinitizeThreadShardedNuma((uint)thread_idx, 2); // assuming two NUMA sockets } Stopwatch sw = new Stopwatch(); sw.Start(); Value value = default(Value); Input input = default(Input); Output output = default(Output); long reads_done = 0; long writes_done = 0; #if DASHBOARD var tstart = Stopwatch.GetTimestamp(); var tstop1 = tstart; var lastWrittenValue = 0; int count = 0; #endif store.StartSession(); while (!done) { long chunk_idx = Interlocked.Add(ref idx_, kChunkSize) - kChunkSize; while (chunk_idx >= kTxnCount) { if (chunk_idx == kTxnCount) { idx_ = 0; } chunk_idx = Interlocked.Add(ref idx_, kChunkSize) - kChunkSize; } for (long idx = chunk_idx; idx < chunk_idx + kChunkSize && !done; ++idx) { Op op; int r = (int)rng.Generate(100); if (r < readPercent) { op = Op.Read; } else if (readPercent >= 0) { op = Op.Upsert; } else { op = Op.ReadModifyWrite; } if (idx % 256 == 0) { store.Refresh(); if (idx % 65536 == 0) { store.CompletePending(false); } } switch (op) { case Op.Upsert: { store.Upsert(ref txn_keys_[idx], ref value, Empty.Default, 1); ++writes_done; break; } case Op.Read: { Status result = store.Read(ref txn_keys_[idx], ref input, ref output, Empty.Default, 1); if (result == Status.OK) { ++reads_done; } break; } case Op.ReadModifyWrite: { Status result = store.RMW(ref txn_keys_[idx], ref input_[idx & 0x7], Empty.Default, 1); if (result == Status.OK) { ++writes_done; } break; } default: throw new InvalidOperationException("Unexpected op: " + op); } } #if DASHBOARD count += (int)kChunkSize; //Check if stats collector is requesting for statistics if (writeStats[thread_idx]) { var tstart1 = tstop1; tstop1 = Stopwatch.GetTimestamp(); threadProgress[thread_idx] = count; threadThroughput[thread_idx] = (count - lastWrittenValue) / ((tstop1 - tstart1) / freq); lastWrittenValue = count; writeStats[thread_idx] = false; statsWritten[thread_idx].Set(); } #endif } store.CompletePending(true); store.StopSession(); sw.Stop(); Console.WriteLine("Thread " + thread_idx + " done; " + reads_done + " reads, " + writes_done + " writes, in " + sw.ElapsedMilliseconds + " ms."); Interlocked.Add(ref total_ops_done, reads_done + writes_done); }
public unsafe void Run() { RandomGenerator rng = new RandomGenerator(); LoadData(); input_ = new Input[8]; for (int i = 0; i < 8; i++) { input_[i].value = i; } GCHandle handle = GCHandle.Alloc(input_, GCHandleType.Pinned); input_ptr = (Input *)handle.AddrOfPinnedObject(); #if DASHBOARD var dash = new Thread(() => DoContinuousMeasurements()); dash.Start(); #endif Thread[] workers = new Thread[threadCount]; Console.WriteLine("Executing setup."); // Setup the store for the YCSB benchmark. for (int idx = 0; idx < threadCount; ++idx) { int x = idx; workers[idx] = new Thread(() => SetupYcsb(x)); } Stopwatch sw = new Stopwatch(); sw.Start(); // Start threads. foreach (Thread worker in workers) { worker.Start(); } foreach (Thread worker in workers) { worker.Join(); } sw.Stop(); Console.WriteLine("Loading time: {0}ms", sw.ElapsedMilliseconds); idx_ = 0; Console.WriteLine("Executing experiment."); // Run the experiment. for (int idx = 0; idx < threadCount; ++idx) { int x = idx; workers[idx] = new Thread(() => RunYcsb(x)); } // Start threads. foreach (Thread worker in workers) { worker.Start(); } Stopwatch swatch = new Stopwatch(); swatch.Start(); if (kCheckpointSeconds <= 0) { Thread.Sleep(TimeSpan.FromSeconds(kRunSeconds)); } else { int runSeconds = 0; while (runSeconds < kRunSeconds) { Thread.Sleep(TimeSpan.FromSeconds(kCheckpointSeconds)); runSeconds += kCheckpointSeconds; } } swatch.Stop(); done = true; foreach (Thread worker in workers) { worker.Join(); } #if DASHBOARD dash.Abort(); #endif double seconds = swatch.ElapsedMilliseconds / 1000.0; Console.WriteLine("Total " + total_ops_done + " ops done " + " in " + seconds + " secs."); Console.WriteLine("##, " + distribution + ", " + numaStyle + ", " + readPercent + ", " + threadCount + ", " + total_ops_done / seconds); }
public unsafe void Run() { Native32.AffinitizeThreadShardedNuma((uint)0, 2); RandomGenerator rng = new RandomGenerator(); LoadData(); input_ = new Input[8]; for (int i = 0; i < 8; i++) { input_[i].value = i; } #if DASHBOARD var dash = new Thread(() => DoContinuousMeasurements()); dash.Start(); #endif Thread[] workers = new Thread[threadCount]; Console.WriteLine("Executing setup."); // Setup the store for the YCSB benchmark. for (int idx = 0; idx < threadCount; ++idx) { int x = idx; workers[idx] = new Thread(() => SetupYcsb(x)); } Stopwatch sw = new Stopwatch(); sw.Start(); // Start threads. foreach (Thread worker in workers) { worker.Start(); } foreach (Thread worker in workers) { worker.Join(); } sw.Stop(); Console.WriteLine("Loading time: {0}ms", sw.ElapsedMilliseconds); long startTailAddress = store.Log.TailAddress; Console.WriteLine("Start tail address = " + startTailAddress); idx_ = 0; Console.WriteLine(store.DumpDistribution()); Console.WriteLine("Executing experiment."); // Run the experiment. for (int idx = 0; idx < threadCount; ++idx) { int x = idx; workers[idx] = new Thread(() => RunYcsb(x)); } // Start threads. foreach (Thread worker in workers) { worker.Start(); } Stopwatch swatch = new Stopwatch(); swatch.Start(); if (kCheckpointSeconds <= 0) { Thread.Sleep(TimeSpan.FromSeconds(kRunSeconds)); } else { int runSeconds = 0; while (runSeconds < kRunSeconds) { Thread.Sleep(TimeSpan.FromSeconds(kCheckpointSeconds)); store.TakeFullCheckpoint(out Guid token); runSeconds += kCheckpointSeconds; } } swatch.Stop(); done = true; foreach (Thread worker in workers) { worker.Join(); } #if DASHBOARD dash.Abort(); #endif double seconds = swatch.ElapsedMilliseconds / 1000.0; long endTailAddress = store.Log.TailAddress; Console.WriteLine("End tail address = " + endTailAddress); Console.WriteLine("Total " + total_ops_done + " ops done " + " in " + seconds + " secs."); Console.WriteLine("##, " + distribution + ", " + numaStyle + ", " + readPercent + ", " + threadCount + ", " + total_ops_done / seconds + ", " + (endTailAddress - startTailAddress)); }
private void RunYcsb(int thread_idx) { RandomGenerator rng = new RandomGenerator((uint)(1 + thread_idx)); if (numaStyle == 0) { Native32.AffinitizeThreadRoundRobin((uint)thread_idx); } else { Native32.AffinitizeThreadShardedNuma((uint)thread_idx, 2); // assuming two NUMA sockets } Stopwatch sw = new Stopwatch(); sw.Start(); Value value = default; long reads_done = 0; long writes_done = 0; #if DASHBOARD var tstart = Stopwatch.GetTimestamp(); var tstop1 = tstart; var lastWrittenValue = 0; int count = 0; #endif while (!done) { long chunk_idx = Interlocked.Add(ref idx_, kChunkSize) - kChunkSize; while (chunk_idx >= kTxnCount) { if (chunk_idx == kTxnCount) { idx_ = 0; } chunk_idx = Interlocked.Add(ref idx_, kChunkSize) - kChunkSize; } for (long idx = chunk_idx; idx < chunk_idx + kChunkSize && !done; ++idx) { Op op; int r = (int)rng.Generate(100); if (r < readPercent) { op = Op.Read; } else if (readPercent >= 0) { op = Op.Upsert; } else { op = Op.ReadModifyWrite; } switch (op) { case Op.Upsert: { store[txn_keys_[idx]] = value; ++writes_done; break; } case Op.Read: { if (store.TryGetValue(txn_keys_[idx], out value)) { ++reads_done; } break; } case Op.ReadModifyWrite: { store.AddOrUpdate(txn_keys_[idx], *(Value *)(input_ptr + (idx & 0x7)), (k, v) => new Value { value = v.value + (input_ptr + (idx & 0x7))->value }); ++writes_done; break; } default: throw new InvalidOperationException("Unexpected op: " + op); } } #if DASHBOARD count += (int)kChunkSize; //Check if stats collector is requesting for statistics if (writeStats[thread_idx]) { var tstart1 = tstop1; tstop1 = Stopwatch.GetTimestamp(); threadProgress[thread_idx] = count; threadThroughput[thread_idx] = (count - lastWrittenValue) / ((tstop1 - tstart1) / freq); lastWrittenValue = count; writeStats[thread_idx] = false; statsWritten[thread_idx].Set(); } #endif } sw.Stop(); Console.WriteLine("Thread " + thread_idx + " done; " + reads_done + " reads, " + writes_done + " writes, in " + sw.ElapsedMilliseconds + " ms."); Interlocked.Add(ref total_ops_done, reads_done + writes_done); }