Commit c6fcf850 authored by Misbah Mubarak's avatar Misbah Mubarak
Browse files

Adding caching data to repo

parent 2aa4749c
Requires:
OSU Micro-Benchmarks 5.3.2 (09/09/16)
http://mvapich.cse.ohio-state.edu/benchmarks/
Build:
- tar xzf osu-micro-benchmarks-5.3.2.tar.gz
- cd osu-micro-benchmarks-5.3.2/mpi
- patch -p1 < ~/osu.pt2pt.patch
- build OSU and link osu_latency with caflu files
Test bed:
- CPU: dual-socket Intel Xeon E5-2650 v3; HT active; governor: powersave
- NIC: Mellanox FDR ConnectX-3 VPI adapter; in IB mode; with IPoIB enabled
- Switch: Mellanox SX6036
- Topology: 2 nodes plus 1 IB switch with static MinHop routing
- OS: CentOS Linux release 7.3.1611
- MPI: Intel(R) MPI Library 2017 Update 1
- Compiler: gcc version 4.8.5 20150623
- OFED: MLNX_OFED_LINUX-3.4-2.0.0.0
Run without and with cache flushes (requ. changes in .c file and recompilation):
- exclusive access to nodes and network during tests
- mpirun -n 2 -ppn 1 -env I_MPI_FABRICS tcp -hosts h1,h2 ./osu_latency -x 4 -i 128
# OSU MPI Latency Test v5.3.2
# Size Latency (us)
0 14.543533 15.497208 15.974045 16.450882 22.053719
1 14.424324 15.497208 15.497208 15.974045 20.027161
2 14.424324 15.020370 15.497208 15.974045 20.503998
4 13.947487 15.020370 15.497208 15.974045 21.457672
8 14.424324 15.020370 15.020370 15.497208 18.954277
16 13.947487 14.901161 15.020370 15.497208 18.954277
32 14.901161 15.497208 15.974045 16.093254 20.503998
64 14.901161 15.497208 15.616417 16.003847 20.384789
128 15.020370 15.616417 16.450882 17.046928 21.934509
256 15.020370 15.497208 16.450882 17.046928 19.907951
512 15.497208 16.361475 16.570091 17.136335 19.550323
1024 16.450882 17.046928 17.523766 18.000603 23.007393
2048 25.510788 26.941299 27.060509 27.537346 30.517578
4096 27.060509 28.014183 28.491020 29.563904 38.504601
8192 36.001205 37.550926 38.027763 38.981438 43.034554
16384 52.928925 55.432320 56.505203 57.011843 70.929527
32768 88.930130 91.075897 92.983246 94.056129 127.077103
65536 164.031982 168.442726 169.992447 171.542168 177.502632
131072 310.540199 394.582748 397.741795 401.139259 410.437584
262144 606.536865 619.322062 623.464584 628.471375 950.932503
524288 1726.984978 1759.320498 1766.502857 1839.041710 1886.487007
1048576 2113.461494 2392.351627 2536.952496 2817.541361 3377.437592
2097152 2856.492996 4362.076521 4503.250122 4611.283541 4737.973213
4194304 6000.518799 6520.897150 7505.536079 8058.667183 13383.507729
# OSU MPI Latency Test v5.3.2
# Size Latency (us)
0 15.974045 17.523766 18.000603 18.596649 23.007393
1 15.974045 17.046928 17.523766 18.000603 20.384789
2 15.974045 16.927719 17.404556 17.523766 22.530556
4 15.020370 16.570091 17.046928 17.523766 20.980835
8 15.020370 16.450882 16.927719 17.046928 19.907951
16 15.020370 16.450882 16.450882 17.046928 22.530556
32 15.497208 16.570091 17.046928 17.523766 22.530556
64 15.497208 16.450882 16.927719 17.046928 18.954277
128 15.497208 17.046928 17.523766 18.477440 22.530556
256 15.497208 16.570091 17.523766 18.477440 20.980835
512 16.450882 17.523766 18.000603 18.596649 19.550323
1024 17.046928 18.000603 18.477440 18.596649 20.980835
2048 25.987625 26.941299 27.537346 28.014183 35.047531
4096 28.014183 29.087067 29.563904 30.040741 32.544136
8192 36.478043 38.504601 38.981438 39.935112 47.564507
16384 54.001808 56.862831 57.578087 58.919191 80.466270
32768 90.479851 95.009804 96.917152 98.586082 125.527382
65536 169.038773 173.926353 176.072121 177.979469 229.477882
131072 293.493271 305.980444 314.772129 322.967768 422.477722
262144 584.006310 599.861145 608.742237 617.623329 664.949417
524288 1769.900322 1800.090075 1917.958260 1925.587654 1939.415932
1048576 1851.439476 2505.779266 2686.738968 2972.424030 3742.456436
2097152 3099.918365 4117.816687 4557.728767 4642.009735 5490.541458
4194304 5639.433861 6084.710360 7411.003113 7710.456848 10903.477669
# OSU MPI Latency Test v5.3.2
# Size Latency (us)
0 23.007393 24.437904 24.914742 25.510788 43.511391
1 21.934509 23.007393 23.484230 23.961067 27.537346
2 14.066696 22.530556 23.007393 23.484230 28.014183
4 21.457672 22.530556 23.007393 23.484230 26.464462
8 21.457672 22.977591 23.245811 23.961067 35.524368
16 21.934509 23.007393 23.007393 23.603439 27.537346
32 15.974045 23.961067 24.080276 25.510788 37.908554
64 22.888184 23.484230 23.961067 24.437904 38.027763
128 22.411346 23.961067 24.557114 25.510788 37.908554
256 23.007393 23.961067 24.557114 25.510788 39.577484
512 23.484230 24.557114 25.510788 26.106834 38.981438
1024 23.961067 25.510788 25.510788 26.017427 38.027763
2048 23.484230 43.988228 44.584274 45.061111 51.021576
4096 26.583672 47.564507 48.041344 48.518181 57.458878
8192 33.020973 39.100647 55.432320 56.505203 63.896179
16384 44.941902 51.975250 53.405762 54.955482 76.532364
32768 76.413155 80.853701 83.923340 101.953745 120.043755
65536 134.468079 144.481659 147.938728 150.442123 180.959702
131072 335.574150 355.571508 367.999077 383.496284 422.477722
262144 687.479973 699.520111 706.970692 716.209412 789.523125
524288 1315.951347 1332.491636 1339.495182 1347.541809 1392.960548
1048576 1510.500908 1933.455467 2071.738243 2254.694700 2690.553665
2097152 3458.499908 3942.906857 4539.310932 4719.614983 8763.432503
4194304 5937.576294 7894.277573 8631.289005 9298.086166 12985.944748
# OSU MPI Latency Test v5.3.2
# Size Latency (us)
0 57.935715 60.558319 61.988831 63.419342 77.486038
1 59.962273 62.465668 63.061714 64.015388 70.929527
2 60.439110 61.988831 63.061714 64.015388 70.095062
4 60.439110 62.465668 63.061714 63.925982 69.975853
8 60.439110 62.465668 63.538551 64.015388 69.022179
16 60.439110 62.465668 63.240528 64.015388 69.975853
32 61.511993 63.061714 64.015388 64.969063 69.975853
64 60.439110 63.061714 64.015388 64.492226 73.075294
128 61.988831 63.538551 64.492226 65.445900 71.525574
256 61.988831 63.419342 64.492226 65.445900 71.525574
512 61.511993 64.015388 64.969063 65.922737 70.929527
1024 62.942505 64.969063 65.743923 66.518784 72.598457
2048 72.002411 74.028969 74.505806 75.578690 80.943108
4096 75.459480 77.486038 78.439713 79.035759 85.473061
8192 83.923340 85.949898 86.545944 87.022781 187.039375
16384 82.015991 84.996223 101.804733 105.023384 542.521477
32768 110.030174 113.964081 115.036964 116.467476 125.050545
65536 180.482864 191.539526 198.006630 202.059746 214.576721
131072 346.541405 374.317169 380.754471 389.575958 406.026840
262144 708.580017 732.034445 737.547874 743.985176 1192.927361
524288 1712.083817 1738.041639 1865.267754 1881.122589 1896.977425
1048576 2218.484879 2906.382084 3125.965595 3303.408623 3790.020943
2097152 7162.094116 7425.814867 7434.487343 7446.646690 7485.032082
4194304 14379.978180 14942.735434 14958.262444 14974.832535 15068.531036
#!/bin/bash
gnuplot plot.gp
epstopdf cache-influ.eps
pdfcrop cache-influ.pdf
rm -f cache-influ.eps cache-influ.pdf
diff -Nur pt2pt.old/caflu.c pt2pt/caflu.c
--- pt2pt.old/caflu.c 1970-01-01 09:00:00.000000000 +0900
+++ pt2pt/caflu.c 2017-05-22 19:11:31.014134488 +0900
@@ -0,0 +1,282 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include <unistd.h>
+#if defined(__INTEL_COMPILER)
+#include "immintrin.h"
+#endif
+
+#include "caflu.h"
+
+bool _cf_initialized = false;
+bool _cf_finalized = false;
+struct _cf {
+ uint8_t num_lvl;
+ struct cf_lvl {
+ uint32_t c_size;
+ uint32_t c_line_size;
+ } cf_lvls[_CF_L3_];
+ char *cf_buf;
+};
+struct _cf _cf_obj = {.num_lvl = 0, .cf_buf = NULL};
+
+#define _PATH_SYS_CACHE "/sys/devices/system/cpu/cpu0/cache"
+
+static inline bool _clfsh_supported(void) {
+ /* code from https://en.wikipedia.org/wiki/CPUID */
+ unsigned int index = 1; /* EAX=1: proc info + feature bits */
+ unsigned int reg[4];
+
+ __asm__ __volatile__(
+#if defined(__x86_64__) || defined(_M_AMD64) || defined (_M_X64)
+ "pushq %%rbx \n\t" /* save %rbx */
+#else
+ "pushl %%ebx \n\t" /* save %ebx */
+#endif
+ "cpuid \n\t"
+ "movl %%ebx ,%[ebx] \n\t" /* write the result into output var */
+#if defined(__x86_64__) || defined(_M_AMD64) || defined (_M_X64)
+ "popq %%rbx \n\t"
+#else
+ "popl %%ebx \n\t"
+#endif
+ : "=a"(reg[0]), [ebx] "=r"(reg[1]), "=c"(reg[2]), "=d"(reg[3])
+ : "a"(index));
+
+ /* CPUID feature flag CLFSH: CPUID.01H:EDX[bit 19] */
+ return ((reg[3] & (0x1 << 19)) ? true : false);
+}
+
+static inline void _clflush(volatile void *__p) {
+ /* code from linux-headers/arch/x86/include/asm/special_insns.h */
+ asm volatile("clflush %0" : "+m" (*(volatile char *)__p));
+}
+
+static inline size_t _not_power_of_two(size_t n) {
+ return (n & (n - 1));
+}
+
+static size_t _next_power_of_two(size_t n) {
+ int shift = 1;
+
+ n -= 1;
+ while (_not_power_of_two(n+1)) {
+ n |= n >> shift;
+ shift <<= 1;
+ }
+
+ return (n+1);
+}
+
+static int _dir_exist(const char *dname) {
+ DIR *dir = opendir(dname);
+ if (dir)
+ closedir(dir);
+ else
+ return 0;
+ return -1;
+}
+
+static int _fread_cache_info(const char *fname, const char *format,
+ unsigned int *res1, char *res2) {
+ char buf[UINT8_MAX];
+ FILE *fp = NULL;
+ int ret = 0;
+
+ if (access(fname, R_OK))
+ return -1;
+
+ fp = fopen(fname, "r");
+ if (!fp)
+ return -1;
+ if (fgets(buf, UINT8_MAX, fp) != NULL){
+ if (res1 && res2)
+ sscanf(buf, format, res1, res2);
+ else if (res1)
+ sscanf(buf, format, res1);
+ else if (res2)
+ sscanf(buf, format, res2);
+ else {
+ fclose(fp);
+ return -1;
+ }
+ }
+ if ((ret = fclose(fp)))
+ return -1;
+
+ return 0;
+}
+
+static int _read_cache_configs(void) {
+ unsigned int i = 0, c_num = 0, lvl = 0;
+ char path[UINT8_MAX], c_str[UINT8_MAX];
+
+ /* assume homogeneous cores -> only check cpu0 for number of caches */
+ for (i = 0; i < UINT8_MAX; i++) {
+ snprintf(path, UINT8_MAX, _PATH_SYS_CACHE "/index%u", i);
+ if (!_dir_exist(path))
+ break;
+
+ snprintf(path, UINT8_MAX, _PATH_SYS_CACHE "/index%u/type", i);
+ if (_fread_cache_info(path, "%s", NULL, c_str))
+ return -1;
+ if (!strcmp(c_str, "Instruction"))
+ continue;
+ c_str[0] = '\0';
+
+ snprintf(path, UINT8_MAX, _PATH_SYS_CACHE "/index%u/level", i);
+ if (_fread_cache_info(path, "%u", &c_num, NULL))
+ return -1;
+ lvl = c_num - 1;
+ c_num = 0;
+
+ snprintf(path, UINT8_MAX,
+ _PATH_SYS_CACHE "/index%u/coherency_line_size", i);
+ if (_fread_cache_info(path, "%u", &c_num, NULL))
+ return -1;
+ _cf_obj.cf_lvls[lvl].c_line_size = c_num;
+ c_num = 0;
+
+ snprintf(path, UINT8_MAX, _PATH_SYS_CACHE "/index%u/size", i);
+ if (_fread_cache_info(path, "%u%s", &c_num, c_str))
+ return -1;
+ if (c_str[0] == '\0')
+ _cf_obj.cf_lvls[lvl].c_size = c_num;
+ else if (!strcmp(c_str, "K"))
+ _cf_obj.cf_lvls[lvl].c_size = c_num << 10;
+ else if (!strcmp(c_str, "M"))
+ _cf_obj.cf_lvls[lvl].c_size = c_num << 20;
+ else
+ return -1;
+ c_num = 0;
+ c_str[0] = '\0';
+
+ _cf_obj.num_lvl++;
+ }
+
+ return 0;
+}
+
+int cf_init(void) {
+ size_t buf_alignment = 0, buf_size = 0;
+ int i = 0, ret = 0;
+
+ if (_cf_initialized || _cf_finalized) {
+ fprintf(stderr, "cf_init called multiple times or after"
+ " cf_finalize; abort");
+ return -1;
+ }
+
+ if (!_clfsh_supported() || _read_cache_configs())
+ goto ERROR;
+
+ for (i = 0; i < _cf_obj.num_lvl; i++) {
+ if (buf_alignment < _cf_obj.cf_lvls[i].c_line_size)
+ buf_alignment = _cf_obj.cf_lvls[i].c_line_size;
+ if (buf_size < _cf_obj.cf_lvls[i].c_size)
+ buf_size = _cf_obj.cf_lvls[i].c_size;
+ }
+ if (_not_power_of_two(buf_alignment))
+ buf_alignment = _next_power_of_two(buf_alignment);
+
+ ret = posix_memalign((void **)&(_cf_obj.cf_buf), buf_alignment,
+ buf_size);
+ if (ret || !_cf_obj.cf_buf) {
+ errno = ENOMEM;
+ goto ERROR;
+ }
+ memset(_cf_obj.cf_buf, 0, buf_size);
+
+ _cf_initialized = true;
+ return 0;
+
+ERROR:
+ (void)cf_finalize();
+ return -1;
+}
+
+int cf_flush(lvl_enum_t lvl) {
+ int i = 0, num_iter = 0, cl_size = 0;
+ char *buf = NULL;
+
+ if (!_cf_initialized || _cf_finalized || !_cf_obj.cf_buf) {
+ fprintf(stderr, "cf_init not called or cf_finalize called"
+ " already; abort");
+ return -1;
+ }
+ if (lvl <= 0 || lvl > _cf_obj.num_lvl) {
+ fprintf(stderr, "invalid requested cache level (%u)\n", lvl);
+ errno = EINVAL;
+ return errno;
+ }
+
+ buf = _cf_obj.cf_buf;
+ cl_size = _cf_obj.cf_lvls[lvl - 1].c_line_size;
+ num_iter = _cf_obj.cf_lvls[lvl - 1].c_size / cl_size;
+ /* load and modify forward */
+ for (i = 0; i < num_iter; i++, buf+=cl_size) {
+ *((uint32_t *)buf) ^= 0x1;
+
+#if defined(__GNUC__)
+ __builtin_prefetch(buf+cl_size, 1, 3);
+#endif
+#if defined(__INTEL_COMPILER)
+ _mm_prefetch(buf+cl_size, _MM_HINT_T0);
+#endif
+ }
+ /* and now evict backwards */
+ for (i = 0, buf-=cl_size; i < num_iter; i++, buf-=cl_size) {
+ _clflush(buf);
+ }
+
+ return 0;
+}
+
+int cf_finalize(void) {
+ if (!_cf_initialized || _cf_finalized) {
+ fprintf(stderr, "cf_init not called or cf_finalize called"
+ " multiple times; abort");
+ return -1;
+ }
+
+ _cf_finalized = true;
+ if (_cf_obj.cf_buf)
+ free(_cf_obj.cf_buf);
+
+ return 0;
+}
+
+/* check L3 [or L2] for Xeon E5-2650 v4:
+ valgrind --tool=cachegrind [--LL=262144,8,64] <prog>
+ callgrind_annotate --auto=yes cachegrind.out.*
+ */
+/*
+int main() {
+ int i = 0, ret = 0, sum = 0;
+ int *data=malloc(1024*sizeof(int));
+
+ for (i = 0; i < 1024; i++)
+ data[i] = i;
+
+ if ((ret = cf_init()))
+ exit(EXIT_FAILURE);
+
+ for (i = 0; i < 1024; i++) {
+ if ((ret = cf_flush(_CF_L2_)))
+ exit(EXIT_FAILURE);
+ sum += data[i];
+ }
+
+ if ((ret = cf_finalize()))
+ exit(EXIT_FAILURE);
+
+ printf("sum %d\n", sum);
+ free(data);
+ return 0;
+}
+*/
diff -Nur pt2pt.old/caflu.h pt2pt/caflu.h
--- pt2pt.old/caflu.h 1970-01-01 09:00:00.000000000 +0900
+++ pt2pt/caflu.h 2017-05-22 19:11:33.522134426 +0900
@@ -0,0 +1,26 @@
+#ifndef _CACHE_FLUSH_H_
+#define _CACHE_FLUSH_H_
+
+#ifdef __cplusplus
+# define BEGIN_C_DECLS extern "C" {
+# define END_C_DECLS }
+#else /* !__cplusplus */
+# define BEGIN_C_DECLS
+# define END_C_DECLS
+#endif /* __cplusplus */
+
+BEGIN_C_DECLS
+
+typedef enum levels {
+ _CF_L1_ = 1, /* flushes "only" L1 data cache */
+ _CF_L2_, /* flushes L1 and L2 data cache */
+ _CF_L3_ /* flushes all caches from L3 down */
+} lvl_enum_t;
+
+int cf_init(void);
+int cf_flush(lvl_enum_t );
+int cf_finalize(void);
+
+END_C_DECLS
+
+#endif /* _CACHE_FLUSH_H_ */
diff -Nur pt2pt.old/osu_latency.c pt2pt/osu_latency.c
--- pt2pt.old/osu_latency.c 2017-05-22 19:14:35.994129912 +0900
+++ pt2pt/osu_latency.c 2017-05-22 19:11:07.134135078 +0900
@@ -9,6 +9,12 @@
* copyright file COPYRIGHT in the top level OMB directory.
*/
#include <osu_pt2pt.h>
+#include <caflu.h>
+#if defined(__INTEL_COMPILER)
+#include "immintrin.h"
+#endif
+#include <gsl/gsl_sort.h>
+#include <gsl/gsl_statistics.h>
int
main (int argc, char *argv[])
@@ -17,8 +23,9 @@
int size;
MPI_Status reqstat;
char *s_buf, *r_buf;
- double t_start = 0.0, t_end = 0.0;
+ double t_start = 0.0, t_end = 0.0, t_delta = 0.0, t_min = 999999.0, t_list[255];
int po_ret = process_options(argc, argv, LAT);
+ int ret;
if (po_okay == po_ret && none != options.accel) {
if (init_accel()) {
@@ -33,6 +40,9 @@
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
MPI_Comm_rank(MPI_COMM_WORLD, &myid);
+ if ((ret = cf_init()))
+ exit(EXIT_FAILURE);
+
if (0 == myid) {
switch (po_ret) {
case po_cuda_not_avail:
@@ -78,9 +88,16 @@
exit(EXIT_FAILURE);
}
+ if (options.loop + options.skip > 255) {
+ if(myid == 0) {
+ fprintf(stderr, "Unsupported iteration count exceeding 255\n");
+ }
+ MPI_Finalize();
+ exit(EXIT_FAILURE);
+ }
+
print_header(myid, LAT);
-
/* Latency test */
for(size = 0; size <= MAX_MSG_SIZE; size = (size ? size * 2 : 1)) {
touch_data(s_buf, r_buf, myid, size);
@@ -94,13 +111,35 @@
if(myid == 0) {
for(i = 0; i < options.loop + options.skip; i++) {
- if(i == options.skip) t_start = MPI_Wtime();
+//#define RUNAVG 1
+#define RUNSTAT 1
+//#define RUNMIN 1
+
+#if defined(RUNAVG)
+ if(i == options.skip) t_delta = 0.0;
+#elif defined(RUNSTAT)
+ // nothing
+#elif defined(RUNMIN)
+ if(i == options.skip) t_min = 999999.0;
+#endif
+ // define which cache level to flush
+ if (0 && (ret = cf_flush(_CF_L1_)))
+ exit(EXIT_FAILURE);
+
+ t_start = MPI_Wtime();
MPI_Send(s_buf, size, MPI_CHAR, 1, 1, MPI_COMM_WORLD);
MPI_Recv(r_buf, size, MPI_CHAR, 1, 1, MPI_COMM_WORLD, &reqstat);
+ t_end = MPI_Wtime();
+#if defined(RUNAVG)
+ t_delta += (t_end - t_start);
+#elif defined(RUNSTAT)
+ t_list[i] = (t_end - t_start) * 1e6 / 2.0;
+#elif defined(RUNMIN)
+ t_delta = (t_end - t_start);
+ if (t_delta < t_min) t_min = t_delta;
+#endif
}
-
- t_end = MPI_Wtime();
}
else if(myid == 1) {
@@ -111,14 +150,32 @@
}
if(myid == 0) {
- double latency = (t_end - t_start) * 1e6 / (2.0 * options.loop);
+#if defined(RUNAVG)
+ double latency = (t_delta) * 1e6 / (2.0 * options.loop);
+#elif defined(RUNSTAT)
+ gsl_sort(&t_list[options.skip], 1, options.loop);
+ printf("%d %f %f %f %f %f\n",
+ size,
+ gsl_stats_quantile_from_sorted_data(&t_list[options.skip], 1, options.loop, 0.00),
+ gsl_stats_quantile_from_sorted_data(&t_list[options.skip], 1, options.loop, 0.25),
+ gsl_stats_median_from_sorted_data(&t_list[options.skip], 1, options.loop),
+ gsl_stats_quantile_from_sorted_data(&t_list[options.skip], 1, options.loop, 0.75),
+ gsl_stats_quantile_from_sorted_data(&t_list[options.skip], 1, options.loop, 1.00));
+#elif defined(RUNMIN)
+ double latency = (t_min) * 1e6 / (2.0);
+#endif
+#if !defined(RUNSTAT)
fprintf(stdout, "%-*d%*.*f\n", 10, size, FIELD_WIDTH,
FLOAT_PRECISION, latency);
+#endif
fflush(stdout);
}
}
+ if ((ret = cf_finalize()))
+ exit(EXIT_FAILURE);
+
free_memory(s_buf, r_buf, myid);
MPI_Finalize();
set terminal postscript eps enhanced color size 6,3 font 'Times,26'
set output 'cache-influ.eps'
set key top left Left reverse samplen 1 maxrows 2
#set xrange[0.7:11000]
set xrange[0.7:6000]
set logscale x
set xlabel 'Message size (bytes)'
set noxtics
set xtics("1" 1, "4" 4, "16" 16, "64" 64, "256" 256, "1024" 1024, "4096" 4096)
#set yrange[0:400]
set yrange[0:200]
set ylabel 'Ping-pong latency statistics (us)'
set bar 1.000000 front
set boxwidth 0.05 absolute
plot 'eth_stat_l0flush' using ($1*0.85):($3*2):($2*2):($6*2):($5*2) with candlesticks lt 1 lw 5 lc rgb '#EFA65D' title 'no flush' whiskerbars, \
'' using ($1*0.85):($4*2):($4*2):($4*2):($4*2) with candlesticks lt -1 lw 2 notitle, \
'eth_stat_l1flush' using ($1*0.95):($3*2):($2*2):($6*2):($5*2) with candlesticks lt 1 lw 5 lc rgb '#75EF5D' title 'L1 flush' whiskerbars, \
'' using ($1*0.95):($4*2):($4*2):($4*2):($4*2) with candlesticks lt -1 lw 2 notitle, \
'eth_stat_l2flush' using ($1*1.05):($3*2):($2*2):($6*2):($5*2) with candlesticks lt 1 lw 5 lc rgb '#5DA1EF' title 'L2 flush' whiskerbars, \
'' using ($1*1.05):($4*2):($4*2):($4*2):($4*2) with candlesticks lt -1 lw 2 notitle, \
'eth_stat_l3flush' using ($1*1.15):($3*2):($2*2):($6*2):($5*2) with candlesticks lt 1 lw 5 lc rgb '#EF5D7F' title 'L3 flush' whiskerbars, \
'' using ($1*1.15):($4*2):($4*2):($4*2):($4*2) with candlesticks lt -1 lw 2 notitle
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment