2017-01-24 10 views
0

Основываясь на previous question, мне нужна программа, которая может принимать процент от 0% до 100%, а затем использовать примерно такую ​​большую часть процессора компьютера, чтобы протестировать службу, которая срабатывает при использовании определенного количества ЦП , Я написал несколько Swift кода, который может сделать это для одного ядра:Могу ли я заставить Swift использовать все ядра?

// workInterval is the fraction of CPU to use, between 0 (none) and 1 (all). 
let workInterval: TimeInterval = <utilization> 
let sleepInterval: UInt32 = UInt32((1 - workInterval) * 1_000_000) 
let startDate = Date() 
var sleepDate = Date() 
while startDate.timeIntervalSinceNow > -<time> { 
    if sleepDate.timeIntervalSinceNow < (workInterval * -1) { 
     print("Sleep") 
     usleep(sleepInterval) 
     sleepDate = Date() 
    } 
} 

Для 60% использования, она в основном проверяет наше if состояния в течение 0,6 секунд, а затем засыпает на 0,4 секунд, повторить. Это отлично работает для любого отдельного ядра, на котором работает код, но мне нужно сделать эту работу на всех ядрах на машине. Есть ли способ сделать это в Свифт? Мне лучше написать этот код на другом языке и выполнить этот скрипт через Swift?

(Да, это очень смешно задача мне было дано.)

+0

Просто используйте 'Dispatch' для многопоточности. Но, кроме того, вам, вероятно, будет гораздо легче провести время, правильно имитируя конкретное использование ЦП, создав приложение, которое использует 100%, а затем ограничит его доступ к ЦП на уровне ОС. – Alexander

+0

@ Александр, к сожалению, я не считаю, что это находится под нашим контролем в этом сценарии. – TheSoundDefense

+0

@TheSoundDefence вы не можете использовать 'nice' или' cpulimit'? – Alexander

ответ

2

Скорее всего, вы можете добиться того, что вы хотите с параллельной очереди. Добавьте один экземпляр вашего вышеуказанного кода в очередь для каждого доступного ядра. Затем каждый из этих экземпляров должен работать параллельно - по одному на каждом ядре.

Возможно, вам потребуется запустить один в основной очереди, а затем запустить экземпляры «core-1» в параллельной очереди.

Но в конце концов вы не имеете никакого контроля над тем, как используются сердечники. Вышеизложенное полагается на время выполнения, эффективно использующее доступные ядра для вас.

+0

А затем, вероятно, увеличить нагрузку на остальных соответственно, чтобы иметь дело с одним ядром, предназначенным для основного потока. – TheSoundDefense

 Смежные вопросы

  • Нет связанных вопросов^_^