На моем оборудовании не работает time.h clock()?
Я пытаюсь измерить тактовые циклы, необходимые для выполнения фрагмента кода на TMS32064x+ DSP, который поставляется с OMAP ZOOM 3430 MDK. Я смотрю на "Руководство программиста" микросхемы DSP и там говорится, что DSP поддерживает функцию clock().
То, что я делаю, действительно просто, я просто делаю
start = clock();
for (i=0;i<100;i++){
/* do something here */
}
stop = clock();
total = stop - start;
и затем поместите значения "start", "stop" и "total" в ранее выделенную общую память с процессором ARM. Затем я просто печатаю его на экране со стороны ARM.
Проблема в том, что при моих первых выполнениях я всегда получаю одно и то же "общее" значение, а затем при следующих запусках я всегда получаю 0! Значения "start" и "stop" соответствуют значению "total".
Самое странное, что они, похоже, следуют некоторому шаблону! Я поставил вывод ниже:
# ./sampleapp
Total = 63744
Start clock() value = 0x000000f9
Stop clock() value = 0x0000f9f9
# ./sampleapp
Total = 4177526784
Start clock() value = 0x00f9f9f9
Stop clock() value = 0xf9f9f9f9
# ./sampleapp
Total clock cyles = 0
Start clock() value = 0xf9f9f9f9
Stop clock() value = 0xf9f9f9f9
Очевидно, что clock() не работает должным образом, но я не уверен, что это из-за чего-то, что я делаю неправильно, или потому, что этот тип вещей не поддерживается с моим оборудованием. Есть идеи, почему это может происходить?
6 ответов
Прочитав до сих пор вопросы, я бы сказал, что Original Poster обладает значительно большим знанием этого вопроса, чем авторы до сих пор, и что подозрение, что clock() не работает (или не поддерживается, и возвращает неопределенный результат) в DSP кажется вполне вероятным.
Как вы распечатываете это? может проблема на самом деле с отображением результата?
на большинстве платформ clock_t это long long. Если вы используете printf с%d, вы можете получить переменные результаты, которые вы видите.
Любопытно, зачем вам предварительно выделенная общая память. Почему бы вам не попробовать обычную переменную стека? Есть ли что-то, что мне не хватает?
Предполагая, что переменные start и end имеют тип 'clock_t', и ваша общая память предполагает то же самое при интерпретации переданного числа другим концом, тогда ваша проблема не в вызове clock, а в том, что вы обрабатываете разницу между start время окончания
Я считаю, что ваша проблема в общей памяти между ними. Можете ли вы опубликовать код, чтобы показать, как вы разделяете память между двумя отдельными процессорами?
Возможно, вы могли бы использовать некоторую встроенную сборку для прямого доступа к регистрам счетчиков ЦП.
TMS320C64x+ имеет 64-битный регистр меток времени в TSCL, TSCH. При сбросе счетчик не включается, сначала нужно записать в регистр, чтобы запустить счетчик (возможно, это проблема с clock
?). Чтение из регистра не совсем тривиально, так как каждая половина должна читаться с отдельной инструкцией (и вы можете получать прерывания...).