Некоторые SAS процедуры имеют возможность непосредствнно контролировать количество ядер процессора.

Так например в SAS 9.3 это процедуры:

  • SORT
  • MEANS

В SAS 9.4 этот перечень значительно расширился:

  • MEANS
  • REPORT
  • SORT
  • SUMMARY
  • TABULATE
  • SQL

Количество ядер процессора можно устанавливать с помощью с помощью опции cpucount. Далее напосредственно в процедуре применять требуемое количество с помощью опции threads | nothreads.

Тест производительности рассмотрим на примере PROC SORT:
Для этого проведем три теста:

  • Моно режим
  • С двумя ядрами процессора
  • С максимальным числом ядер

Подготовка


Сгенерируем тестовые данные для дальнейшего использования:

%let anzahl = 10000000;
data work.test;
	do i = 1 to &anzahl.;
		x = 10 * ranuni(1234);
		y = 1 + 2 * sqrt(10 * ranuni(1234)) + .5 * rannor(5678);
		s = y + round(rand('uniform'), 1.0);
		output;
	end;
RUN;

Результат:

NOTE: THE DATA SET WORK.TEST HAS 100000000 OBSERVATIONS AND 4 VARIABLES.
NOTE: COMPRESSING DATA SET WORK.TEST INCREASED SIZE BY 74.87 PERCENT.
      COMPRESSED IS 691191 PAGES; UN-COMPRESSED WOULD REQUIRE 395258 PAGES.
NOTE: DATA STATEMENT USED (TOTAL PROCESS TIME):
      REAL TIME           1:16.46
      USER CPU TIME       1:02.09
      SYSTEM CPU TIME     14.11 SECONDS
      MEMORY              297.09K
      OS MEMORY           6696.00K
      TIMESTAMP           05/09/2018 11:33:27 AM
      PAGE FAULTS                       0
      PAGE RECLAIMS                     0
      PAGE SWAPS                        0
      VOLUNTARY CONTEXT SWITCHES        84
      INVOLUNTARY CONTEXT SWITCHES      8106
      BLOCK INPUT OPERATIONS            0
      BLOCK OUTPUT OPERATIONS           0

Тест 1 (Без многоядерности)


      proc sort data = work.test out = work.test_str nothreads;
         by x y s;
      run;

Результат 6 минут 19 секунд:

NOTE: There were 100000000 observations read from the data set WORK.TEST.
NOTE: The data set WORK.TEST_STR has 100000000 observations and 4 variables.
NOTE: Compressing data set WORK.TEST_STR increased size by 74.87 percent.
      Compressed is 691191 pages; un-compressed would require 395258 pages.
NOTE: PROCEDURE SORT used (Total process time):
      real time           6:19.21
      user cpu time       5:25.75
      system cpu time     52.98 seconds
      memory              7067869.50k
      OS Memory           7075500.00k
      Timestamp           05/09/2018 11:48:58 AM
      Page Faults                       0
      Page Reclaims                     0
      Page Swaps                        0
      Voluntary Context Switches        3132
      Involuntary Context Switches      13769
      Block Input Operations            0
      Block Output Operations           0

Тест 2 (С использованием 2 ядер процессора)


/* Set the threads option and number of CPU’s that SAS will use */
options threads cpucount=2;

/* PROC OPTIONS will display the options and used CPUCORES */
proc options group=performance; run;

proc sort data = work.test out = work.test_str threads;
    by x y s;
run;

Резултат 2 мин 49 секунд:

NOTE: There were 100000000 observations read from the data set WORK.TEST.
NOTE: The data set WORK.TEST_STR has 100000000 observations and 4 variables.
NOTE: Compressing data set WORK.TEST_STR increased size by 74.87 percent.
      Compressed is 691191 pages; un-compressed would require 395258 pages.
NOTE: PROCEDURE SORT used (Total process time):
      real time           2:49.20
      user cpu time       5:07.38
      system cpu time     1:05.13
      memory              8628050.15k
      OS Memory           8636632.00k
      Timestamp           05/09/2018 12:05:47 PM
      Page Faults                       0
      Page Reclaims                     0
      Page Swaps                        0
      Voluntary Context Switches        12985
      Involuntary Context Switches      22069
      Block Input Operations            0
      Block Output Operations           0

Тест 3 (Максимально допустимое количество ядер)


/* Set the threads option and number of CPU’s that SAS will use */
options threads cpucount=ACTUAL;

/* PROC OPTIONS will display the options and used CPUCORES */
proc options group=performance; run;
  
proc sort data = work.test out = work.test_str threads;
    by x y s;
run;

Результат 2 минуты 3 секунды:

NOTE: There were 100000000 observations read from the data set WORK.TEST.
NOTE: The data set WORK.TEST_STR has 100000000 observations and 4 variables.
NOTE: Compressing data set WORK.TEST_STR increased size by 74.87 percent.
      Compressed is 691191 pages; un-compressed would require 395258 pages.
NOTE: PROCEDURE SORT used (Total process time):
      real time           2:03.55
      user cpu time       4:07.55
      system cpu time     43.94 seconds
      memory              8634428.25k
      OS Memory           8642784.00k
      Timestamp           05/09/2018 12:09:37 PM
      Page Faults                       0
      Page Reclaims                     0
      Page Swaps                        0
      Voluntary Context Switches        20068
      Involuntary Context Switches      12946
      Block Input Operations            0
      Block Output Operations           0

Таким образом на примерах рассмотрели влияние колличества ядер процессора на скорость обработки данных. Можно сдалать вывод что включение параллельной обработки существенно повлияло на скорость, хотя дальнейшее увеличения ядер не оказало сильного влияния и для ускореения нужно использовать другие методы оптимизации.

Комментарии (2)


  1. Bessnov
    10.05.2018 12:12

    Автор, за полезную опцию спасибо!
    А вот тест3 и вывод сильно некорректны.

    На каком оборудовании проводились тесты?
    Сколько там процессоров?
    А может быть всё «упёрлось» в дисковую подсистему или память?


  1. deweweb Автор
    10.05.2018 12:14

    возможно и так, тест3 был на 32 ядерном процессоре собственно