Я могу выполнить несколько ядер в различных тактовых частотах?

Если Вы знаете наверняка, что некоторый символ никогда не будет происходить в первом файле затем, можно использовать вставку.

Пример вставки с помощью вкладки разделителя по умолчанию:

paste file1 file2 | while IFS="$(printf '\t')" read -r f1 f2
do
  printf 'f1: %s\n' "$f1"
  printf 'f2: %s\n' "$f2"
done

Пример использования вставки @:

paste -d@ file1 file2 | while IFS="@" read -r f1 f2
do
  printf 'f1: %s\n' "$f1"
  printf 'f2: %s\n' "$f2"
done

Обратите внимание, что это достаточно, если символ, как гарантируют, не произойдет в первом файле. Это вызвано тем, что read проигнорирует IFS при заполнении последней переменной. Итак, даже если @ происходит во втором файле, он не будет разделен.

Пример вставки, использующей некоторые функции удара для возможно более чистого кода:

while IFS=$'\t' read -r f1 f2
do
  printf 'f1: %s\n' "$f1"
  printf 'f2: %s\n' "$f2"
done < <(paste file1 file2)

Функции Bash использовали: струна до ansi ($'\t') и замена процесса (<(...)) избегать цикла с условием продолжения в проблеме подоболочки.

Если Вы не можете быть уверены, что любой символ никогда не будет происходить в обоих файлах затем, можно использовать дескрипторы файлов.

while true
do
  read -r f1 <&3 || break
  read -r f2 <&4 || break
  printf 'f1: %s\n' "$f1"
  printf 'f2: %s\n' "$f2"
done 3

Не протестированный очень. Мог бы повредиться на пустых строках.

Дескрипторы файлов номер 0, 1, и 2 уже используются для stdin, stdout, и stderr, соответственно. Дескрипторы файлов от 3 и (обычно) свободны. Руководство удара предупреждает от использования дескрипторов файлов, больше, чем 9, потому что они "используются внутренне".

Обратите внимание, что открытые дескрипторы файлов наследованы для окружения функций и внешних программ. Функции и программы, наследовавшие открытый дескриптор файла, могут читать из (и записать в), дескриптор файла. Необходимо заботиться для закрытия всех дескрипторов файлов, которые не требуются прежде, чем назвать функциональную или внешнюю программу.

Вот та же программа как выше с фактической работой (печать) разделена от метаработы (читающий линию за линией из двух файлов параллельно).

work() {
  printf 'f1: %s\n' "$1"
  printf 'f2: %s\n' "$2"
}

while true
do
  read -r f1 <&3 || break
  read -r f2 <&4 || break
  work "$f1" "$f2"
done 3

Теперь мы притворяемся, что не имеем никакого контроля над кодом работы и что код, по любой причине, пытается читать из дескриптора файла 3.

unknowncode() {
  printf 'f1: %s\n' "$1"
  printf 'f2: %s\n' "$2"
  read -r yoink <&3 && printf 'yoink: %s\n' "$yoink"
}

while true
do
  read -r f1 <&3 || break
  read -r f2 <&4 || break
  unknowncode "$f1" "$f2"
done 3

Вот вывод в качестве примера. Обратите внимание, что вторая строка из первого файла "украдена" от цикла.

f1: file1 line1
f2: file2 line1
yoink: file1 line2
f1: file1 line3
f2: file2 line2

Вот то, как необходимо закрыть дескрипторы файлов прежде, чем назвать внешний код (или любой код в этом отношении).

while true
do
  read -r f1 <&3 || break
  read -r f2 <&4 || break
  # this will close fd3 and fd4 before executing anycode
  anycode "$f1" "$f2" 3<&- 4<&-
  # note that fd3 and fd4 are still open in the loop
done 3

7
08.01.2013, 01:37
1 ответ

Это еще не близко к быть определенным ответом. Вместо этого это - ряд предложений слишком долго для вписываний в комментарии.

Я боюсь, что Вы могли бы немного неправильно истолковать значения sysfs cpufreq параметры. Например, на моем Базовом ноутбуке Duo, related_cpu параметры для обоих чтений ядер 0 1 - который, согласно Вашей интерпретации, означал бы, что ядра не могут переключить частоты независимо. Но дело не в этом - я могу установить каждую частоту по желанию. В отличие от этого, affected_cpus параметр для каждого ядра перечисляет только соответствующее число ЦП.

Вы могли бы хотеть смотреть на документацию ядра для частоты CPU для получения лучшего понимания параметров такой как affected_cpus,related_cpus,scaling_* и cpuinfo_*. Документация обычно распределяется с исходными пакетами ядра. А именно, я рекомендую читать <kernel-sources-dir>/Documentation/cpu-freq/user-guide.txt, где <kernel-sources-dir> обычно обозначал бы /usr/src/linux или /usr/src/linux-<kernel-version>. (Однако, когда я скольжу через документацию сам теперь, я признаюсь, что не ловлю некоторые связанные с частотным масштабированием нюансы. Чтобы полностью понять их, вероятно, нужно получить основательное понимание архитектур ЦП сначала.)

Назад к Вашему вопросу. И еще один тестовый сценарий с моей стороны: когда я изменяю значение scaling_max_freq (с также userspace или performance используемый регулятор), часы ядра автоматически переключаются на тот новый максимум. Другое поведение, которое Вы наблюдаете, могло бы быть любым из:

  • характерный для аппаратной реализации механизмов частотного масштабирования на Вашем ЦП,
  • из-за различий между стандартом cpufreq модуль и phc-intel который я использую,
  • нормальное поведение (называют это ошибкой или функцией, если Вы будете) cpufreq модуль, который изменился в какой-то момент с тех пор 2.6.35 (моя текущая версия ядра 3.6.2),
  • результат ошибки в cpufreq реализация для Вашего ЦП (или все семейство),
  • характерный для реализации performance Регулятор ЦП с 2.6.35.

Некоторые вещи Вы могли бы сделать для продвижения расследования далее:

  • читайте user-guide.txt и скрипка больше с другим cpufreq параметры,
  • повторите тесты при выполнении более нового ядра - самый легкий путь состоит в том, чтобы загрузить liveCD/DVD/USB.

Если Вы продолжаете испытывать неожиданное поведение и получать больше причин полагать, что это происходит из-за ошибки (определенно должен свериться с последней незначительной версией ядра), разрешение, и сообщите об этом относительно kernel.org Bugzilla.

4
27.01.2020, 20:19

Теги

Похожие вопросы