Я знаю, что подобные вопросы задавались, хотя ответ, похоже, сильно зависит от типа выполняемых операций, поэтому я подумал, что мне следует спросить о моем конкретном случае c здесь. Я также новичок в этом, так что простите мою неопытность.
У меня есть очень большой CSV-файл, который мне нужно обработать, около 400 миллионов строк (фактически разделенных на несколько CSV-файлов). Мой скрипт читает строку, выполняет вычисления, а затем записывает результат в отдельный выходной CSV-файл.
Каждая строка может быть вычислена независимо, поэтому я могу разбить свой файл на столько маленьких кусочков, сколько мне хотелось бы. Когда я запускаю lscpu
, я получаю следующее:
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 32
On-line CPU(s) list: 0-31
Thread(s) per core: 2
Core(s) per socket: 16
Socket(s): 1
NUMA node(s): 1
Vendor ID: AuthenticAMD
CPU family: 23
Model: 1
Model name: AMD Ryzen Threadripper 1950X 16-Core Processor
Stepping: 1
CPU MHz: 3692.603
CPU max MHz: 3400.0000
CPU min MHz: 2200.0000
BogoMIPS: 6786.40
Virtualization: AMD-V
L1d cache: 32K
L1i cache: 64K
L2 cache: 512K
L3 cache: 8192K
NUMA node0 CPU(s): 0-31
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid amd_dcm aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb hw_pstate sme ssbd vmmcall fsgsbase bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xgetbv1 xsaves clzero irperf xsaveerptr arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif overflow_recov succor smca
Мой план состоял в том, чтобы разбить мой файл на N более мелких частей, а затем запустить мой процесс, запускаемый N раз (при условии, что N задач будет отправлено на разные ядра, если это возможно).
Тогда у меня вопрос: какое значение N мне выбрать? У меня 16 ядер, но по два ядра на ядро. Должен ли я запускать процессы, используя все 32 потока или только 16?
Я выполнил некоторый тестовый код для файла с 10000 строками, и вот время (где чтение / запись были синхронизированы как одна операция):
Mean read/write time = 0.0002238105
Mean compute time = 0.0724388522
Total read/write time = 2.238105
Total compute time = 724.388522
Я не знаю, сколько операций чтения / записи t ie загружает процессор, поэтому, возможно, это не имеет значения.
Могу ли я разделить его на 32 процесса и ускорить более 16 процессов? Или тот факт, что два процесса совместно используют каждое ядро, замедляет отдельные процессы до точки, где нет net ускорения?
Кроме того, если я запускаю 16 или 32 отдельных процесса (используя другой экран windows) будут ли они автоматически назначаться различным ядрам / потокам? Или мне нужно что-то сделать, чтобы их разложить?