মাইক্রোসেকেন্ড রিসোলিউশনের জন্য কি কি সময় পাওয়া যায়?

তাই আমি নিজেকে একটি গেম porting খুঁজে পেতে, যে মূলত লিনাক্স Win32 এপিআই জন্য লিখিত ছিল (ভাল, লিনাক্স থেকে Win32 পোর্ট OS X পোর্ট পোর্টিং)। প্রসেসটি শুরু হওয়ার পর থেকে uSeconds প্রদান করে আমি QuestionPerformanceCounter প্রয়োগ করেছি।

BOOL QueryPerformanceCounter(LARGE_INTEGER* performanceCount)
{
    gettimeofday(&currentTimeVal, NULL);
    performanceCount->QuadPart = (currentTimeVal.tv_sec - startTimeVal.tv_sec);
    performanceCount->QuadPart *= (1000 * 1000);
    performanceCount->QuadPart += (currentTimeVal.tv_usec - startTimeVal.tv_usec);

    return true;
}

এটি, প্রশ্নগ্রন্থের সাথে সাথে ফ্রিকোয়েন্সি() ফ্রিকোয়েন্সি হিসাবে স্থির 1000000 প্রদান করে আমার মেশিনে ভালভাবে কাজ করে, আমাকে একটি 64 বিট ভেরিয়েবল প্রদান করে যার মধ্যে রয়েছে uSeconds প্রোগ্রাম এর শুরু পর্যন্ত। তাই কি এই পোর্টেবল? কার্নেলটি একটি নির্দিষ্ট বা অন্য যেকোনো কিছুতে সংকলিত হলে আমি এটি ভিন্নভাবে কাজ করতে চাই না। আমি এটি লিনাক্স ছাড়া অন্য কিছু অ পোর্টেবল হচ্ছে সঙ্গে জরিমানা, যাইহোক ,.

0
যোগ সম্পাদিত
মতামত: 7

10 উত্তর

আমার অভিজ্ঞতা থেকে, এবং আমি ইন্টারনেট জুড়ে পড়া কি থেকে, উত্তর "না," এটা নিশ্চিত নয়। এটি লিনাক্সের সিপিইউ গতি, অপারেটিং সিস্টেম, স্বাদ ইত্যাদি উপর নির্ভর করে।

0
যোগ

gettimeofday এর প্রকৃত রেজোলিউশন() হার্ডওয়্যার আর্কিটেকচারের উপর নির্ভর করে। ইন্টেল প্রসেসর এবং SPARC মেশিনগুলি হাই রেজোলিউশন টাইমার যা মাইক্রোসেকেন্ডের পরিমাপ দেয়। অন্যান্য হার্ডওয়্যার আর্কিটেকচারগুলি সিস্টেমের টাইমারে ফিরে যায়, যা সাধারণত 100 Hz তে সেট করা হয়। এই ক্ষেত্রে, সময় রেজল্যুশন কম সঠিক হবে। ?

I obtained this answer from High Resolution Time Measurement and Timers, Part I

0
যোগ

হতে পারে. কিন্তু আপনার বড় সমস্যা আছে। gettimeofday() আপনার সিস্টেমের প্রক্রিয়ায় যে টাইমার পরিবর্তন (ie, ntpd) ভুল সময়সীমার মধ্যে হতে পারে। একটি "স্বাভাবিক" লিনাক্সে, যদিও, আমি বিশ্বাস করি gettimeofday() 10us এর রেজল্যুশন। এটি আপনার সিস্টেমে চলমান প্রসেসগুলির উপর ভিত্তি করে ফরোয়ার্ড এবং পশ্চাদপদ এবং সময় তিড়িং লাফ দিতে পারে। এটি কার্যকরভাবে আপনার প্রশ্নের কোন উত্তর তোলে।

আপনি clock_gettime (CLOCK_MONOTONIC) টাইমিং বিরতির জন্য দেখবেন। মাল্টি-কোর সিস্টেম এবং বহিরাগত ক্লক সেটিংসের মত বিষয়গুলির কারণে এটি অনেক কম সমস্যা ভোগ করে।

এছাড়াও, clock_getres() ফাংশনটি দেখুন।

0
যোগ
এটি 2001 সালে চালু করা হয়েছিল, কিন্তু POSIX 2008 পর্যন্ত বাধ্যতামূলক নয়
যোগ লেখক R.., উৎস
Lock_gettime- এর জন্য লিনাক্সের প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী থেকে (ডেভিড শেলসনাগল এর উত্তর দেখুন) "CLOCK_MONOTONIC ... এটি NTP দ্বারা অ্যাডটেনক্স() দ্বারা নিয়ন্ত্রিত হয়। ভবিষ্যতে (আমি এখনও প্যাচটি পেতে চেষ্টা করছি) সেখানে একটি CLOCK_MONOTONIC_RAW থাকবে না সব সময়ে সংশোধন করা হবে, এবং হার্ডওয়্যার কাউন্টারের সঙ্গে একটি রৈখিক সহযোদ্ধা হবে। " আমি মনে করি না যে _RAW ঘড়িটি কখনও কার্নেলে পরিণত হয়েছিল (যদি না এর নামকরণ করা হয় _ এইচআর, তবে আমার গবেষণায় বলা হয় যে প্রচেষ্টাগুলিও পরিত্যাগ করা হচ্ছে)।
যোগ লেখক Tony Delroy, উৎস
@ জাজনী.ভি.চ. এটি পিওএসআইএস এর তাই এটি লিনাক্স না শুধুমাত্র 'নতুন'? এমনকি 'এন্টারপ্রাইজ' ডিস্ট্রো যেমন Red Hat Enterprise Linux 2.6.18 এর উপর ভিত্তি করে তৈরি করা হয়েছে যা clock_gettime তাই নেই, খুব নতুন নয়। (RHEL- এর ম্যানপ্যাডের তারিখ ২004-মার্চ -২২ হয় তাই কিছুটা সময় ধরে) আপনি কি বলতে চান সত্যিকারের পুরানো ওল্ড কার্নেল WTF সম্পর্কে কথা বলছেন?
যোগ লেখক Spudd86, উৎস
clock_gettime শুধুমাত্র নতুন লিনাক্সে বিদ্যমান। অন্যান্য সিস্টেম শুধুমাত্র gettimeofday আছে ()
যোগ লেখক vitaly.v.ch, উৎস
clock_gettime ২001 সালে POSIX- এ অন্তর্ভুক্ত করা হয়েছিল। যতক্ষণ পর্যন্ত আমি বর্তমানে clock_gettime() লিনাক্স 2.6 এবং qnx এ বাস্তবায়িত করি। কিন্তু লিনাক্স 2.4 বর্তমানে অনেক উত্পাদন সিস্টেমের মধ্যে ব্যবহার করা হয়।
যোগ লেখক vitaly.v.ch, উৎস

ওয়াইন আসলে gettimeofday() ব্যবহার করে QueryPerformanceCounter() বাস্তবায়ন করে এবং এটি অনেক উইন্ডোজ গেমস লিনাক্স ও ম্যাকের জন্য কাজ করে।

Starts http://source.winehq.org/source/dlls/kernel32/cpu.c#L312

leads to http://source.winehq.org/source/dlls/ntdll/time.c#L448

0
যোগ

উচ্চ রেজোলিউশন, ইন্টেল প্রসেসরের জন্য নিম্ন ওভারহেড টাইম

আপনি যদি ইন্টেল হার্ডওয়্যারে থাকেন, তাহলে এখানে কীভাবে CPU প্রকৃত-সময় নির্দেশিকা পাল্টাবেন। এটি আপনাকে প্রসেসরের বুট করার সময় চালানো CPU চক্রের সংখ্যাটি জানাবে। এটি সম্ভবত সেরা পরিমাপক পাল্টা আপনি কর্মক্ষমতা পরিমাপের জন্য পেতে পারেন।

লক্ষ্য করুন যে এটি CPU চক্রের সংখ্যা। Linux এ আপনি / proc / cpuinfo থেকে CPU গতি পেতে পারেন এবং সেকেন্ডের সংখ্যা পেতে ভাগ করতে পারেন। এটি একটি ডবল রূপান্তর বেশ সহজ হয়।

আমি আমার বাক্সে এই চালানোর সময়, আমি পেতে

11867927879484732
11867927879692217
it took this long to call printf: 207485

এখানে ইন্টেল বিকাশকারীর গাইড যা বিস্তারিতভাবে প্রচুর পরিমাণে প্রদান করে।

#include 
#include 

inline uint64_t rdtsc() {
    uint32_t lo, hi;
    __asm__ __volatile__ (
      "xorl %%eax, %%eax\n"
      "cpuid\n"
      "rdtsc\n"
      : "=a" (lo), "=d" (hi)
      :
      : "%ebx", "%ecx");
    return (uint64_t)hi << 32 | lo;
}

main()
{
    unsigned long long x;
    unsigned long long y;
    x = rdtsc();
    printf("%lld\n",x);
    y = rdtsc();
    printf("%lld\n",y);
    printf("it took this long to call printf: %lld\n",y-x);
}
0
যোগ
আপনার কোডটি CPUID ব্যবহার করতে হবে প্রথমে RDTSC নির্দেশের পরে এবং কোডটি বজায় রাখার পূর্বে কি কোডটি ব্যবহার করা উচিত? অন্যথায়, প্রথম <�কোড> RDTSC এর সাথে / সমান্তরাল আগে বেঞ্চমার্ক কোডটি কীভাবে থামানো হবে, এবং এর ফলে RDTSC ডেল্টা অনুসারে উপস্থাপিত হবে?
যোগ লেখক Tony Delroy, উৎস
উল্লেখ্য, TSC সবসময় কোরের মধ্যে সিঙ্ক্রোনাইজড হতে পারে না, প্রসেসরটি নিম্ন শক্তি মোডগুলিতে প্রবেশ করে (অথবা আপনার কাছে এটি জানার উপায় নেই), যখন এটির ফ্রিকোয়েন্সি পরিবর্তন বা পরিবর্তন করতে পারে, এবং সাধারণভাবে সবসময় নির্ভরযোগ্য নয়। কার্নেল এটি নির্ভরযোগ্য যখন সনাক্ত করতে সক্ষম হয়, HPET এবং ACPI PM টাইমার মত অন্যান্য বিকল্পগুলি সনাক্ত করে এবং স্বয়ংক্রিয়ভাবে সর্বোত্তম একটি নির্বাচন করে এটি সঠিক সময়সীমার জন্য কার্নেল ব্যবহার করার একটি ভাল ধারণা যদি না আপনি সত্যিই নিশ্চিত যে TSC স্থিতিশীল এবং একঘেয়ে হয়।
যোগ লেখক CesarB, উৎস
কোর এবং উপরের ইন্টেল প্ল্যাটফর্মের TSC একাধিক CPU- র মধ্যে এবং বৃদ্ধি একটি শক্তি ফ্রিকোয়েন্সি শক্তি পরিচালন রাজ্যের স্বাধীন হয়। ইন্টেল সফটওয়্যার বিকাশকারীর ম্যানুয়াল, ভল দেখুন। 3 সেকশন 18.10 যাইহোক, যে হারে কাউন্টার ইনক্রিমেন্টগুলি না সিপিইউ এর ফ্রিকোয়েন্সি হিসাবে একই। টিএসসি প্ল্যান্টের সর্বাধিক সমাধানকৃত ফ্রিকোয়েন্সি এ TSC বৃদ্ধি, যা আকারযোগ্য বাস ফ্রিকোয়েন্সি এবং সর্বোচ্চ সমাধানকৃত বাস অনুপাতের পণ্য সমান? ইন্টেল সফটওয়্যার বিকাশকারীর ম্যানুয়াল, ভল। 3 ধারা 18.18.5 আপনি CPU- এর মডেল নির্দিষ্ট রেজিস্টারে (MSRs) থেকে এই মানগুলি পান।
যোগ লেখক sstock, উৎস
আপনি সিপিইউ এর মডেল-নির্দিষ্ট নিবন্ধন (MSRs) জিজ্ঞাসা করে স্কেলযোগ্য বাস ফ্রিকোয়েন্সি এবং সর্বাধিক সমাধানকৃত বাস অনুপাত পেতে পারেন: স্কেলেবল বাস ফ্রিকোয়েন্সি == MSR_FSB_FREQ [2: 0] আইডি 0xCD, সর্বোচ্চ সমাধানকৃত বাসের অনুপাত == MSR_PLATFORM_ID [ 1২: 8] আইডি 0x17 নিবন্ধিত মূল্য ব্যাখ্যা করার জন্য ইন্টেল এসডিএম ভল .3 পরিশিষ্ট B.1- কে পরামর্শ দিন। আপনি রেজিস্ট্রারদের জিজ্ঞাসা করতে লিনাক্সে এমএসআর-সরঞ্জাম ব্যবহার করতে পারেন। kernel.org/pub/linux/utils/cpu/msr-tools
যোগ লেখক sstock, উৎস

@Bernard:

আমাকে স্বীকার করতে হবে, আপনার বেশিরভাগ উদাহরণ সরাসরি আমার মাথার উপরে গিয়েছিলাম। এটি সংকলন করে, এবং কাজ বলে মনে হয়, যদিও। এসএমপি সিস্টেম বা SpeedStep কি নিরাপদ?

এটি একটি ভাল প্রশ্ন ... আমি মনে করি কোড এর ঠিক আছে। একটি বাস্তব দৃষ্টিকোণ থেকে, আমরা প্রতিদিন আমার কোম্পানীতে এটি ব্যবহার করি, এবং আমরা একটি চমত্কার বিস্তৃত অ্যারের চালানো, 2-8 কোর থেকে সবকিছু। অবশ্যই, YMMV, ইত্যাদি, কিন্তু এটি একটি নির্ভরযোগ্য এবং নিম্ন ওভারহেড বলে মনে করা হয় (কারণ এটি সিস্টেম-স্পেসে প্রক্সি সুইচ তৈরি করে না) পদ্ধতি টাইমিং এর

সাধারণত এটি কিভাবে কাজ করে:

  • কোডের ব্লকটি সংযোজক বলে ঘোষণা করুন (এবং অস্থির, তাই অপটিমাইজার এটি একা ছেড়ে যাবে)।
  • CPUID নির্দেশ চালানো। কিছু সিপিইউ তথ্য পেতে ছাড়াও (যা আমরা কিছুই করি না) এটি CPU এর এক্সিকিউশন বাফারকে সিঙ্ক্রোনাইজ করে যাতে আউটস অফ অর্ডার এক্সিকিউশন দ্বারা সময়গুলি প্রভাবিত হয় না।
  • rdtsc (টাইমস্ট্যাম্প) পড়া চালানো এই সংখ্যা সংখ্যা fetches প্রসেসরটি রিসেট করার পর মেশিন চক্র চালানো হয়েছে। এটি একটি 64-বিট মান, তাই বর্তমান CPU গতির সাথে এটি প্রায় 194 বছর বা তার কাছাকাছি মোড়ানো হবে। আশ্চর্যজনক, মূল প্যান্টিয়াম রেফারেন্সে, তারা এটি প্রায় প্রতিটা wraps নোট 5800 বছর বা তারও বেশি।
  • শেষ দম্পতি রেজিস্টারে থেকে মানগুলি সংরক্ষণ করে ভেরিয়েবলগুলি hi এবং lo, এবং এটি 64-বিট রিটার্ন মানের মধ্যে রাখুন।

নির্দিষ্ট নোট:

  • আউট অফ অর্ডার এক্সিকিউশন ভুল ফলাফল হতে পারে, তাই আমরা চালানো "cpuid" নির্দেশ যা আপনাকে কিছু তথ্য দেওয়ার পাশাপাশি সিপিইউ সম্পর্কে কোনও আউট অফ অর্ডার নির্দেশ কার্যকর করা হয়।

  • বেশিরভাগ ওএসগুলি যখন সূচনাপ্রাপ্ত হয় তখন CPU গুলির কাউন্টারগুলিকে সিঙ্ক্রোনাইজ করে, তাই উত্তরটি কয়েকটি ন্যানো-সেকেন্ডের মধ্যে ভাল।

  • হাইবারনেট মন্তব্য সম্ভবত সত্য, কিন্তু অনুশীলন আপনি সম্ভবত হাইবারনেশনের সীমারেখাগুলি সম্পর্কে যত্ন নেবেন না।

  • গতির পরিবর্তন: নতুন ইন্টেল CPU গুলি গতির জন্য ক্ষতিপূরণ প্রদান করে পরিবর্তন এবং একটি সংশোধিত গণনা ফেরত। আমি একটি দ্রুত স্কিন ওভার করেছি আমাদের নেটওয়ার্কে কিছু বাক্স এবং শুধুমাত্র একটি বক্স পাওয়া যায় এটি ছিল না: একটি Pentium 3 কিছু পুরানো ডাটাবেস সার্ভার চলমান। (এইগুলি লিনাক্স বক্স, তাই আমি এর সাথে চেক করেছি: grep constant_tsc / proc / cpuinfo)

  • আমি AMD CPUs সম্পর্কে নিশ্চিত নই, আমরা মূলত একটি Intel দোকান, যদিও আমি জানি আমাদের নিম্ন স্তরের সিস্টেমের কিছু গুরু আছে এএমডি মূল্যায়ন।

আশা করি আপনার কৌতূহল সন্তুষ্ট হবে, এটি একটি আকর্ষণীয় এবং (IMHO) প্রোগ্রামিং অধীন অধিক্ষেত্র এলাকা। আপনি জাফ এবং জোয়েল ছিল যখন আপনি জানেন কোন প্রোগ্রামারকে C জানা উচিত কিনা বা না বলার কথা? আমি ছিলাম তাদের কণ্ঠস্বর, "হে উচ্চ স্তরের সি জিনিস ভুলবেন না ... অ্যাসিল্ডার আপনি যদি কম্পিউটারটি জানতে চান তবে আপনি যা শিখতে চান তা শিখতে হবে করছেন! "

0
যোগ
রেফারেন্সের জন্য, আমি জিজ্ঞাসা করা প্রশ্ন (একটি পৃথক উত্তর - মন্তব্য করার আগে) ছিল: "আমাকে স্বীকার করতে হবে, আপনার বেশিরভাগ উদাহরণ সরাসরি আমার মাথার উপরে গিয়েছিল। এটি সংকলন করে এবং কাজ করে বলে মনে হয়, যদিও এটি নিরাপদ। এসএমপি সিস্টেম বা SpeedStep? "
যোগ লেখক Bernard, উৎস
... কার্নেল লোকেরা কিছুদিনের জন্য rdtsc ব্যবহার বন্ধ করার চেষ্টা করছে ... এবং সাধারণত এটি কার্নেলে ব্যবহার করা এড়িয়ে চলতে পারে কারণ এটি শুধুই অবিশ্বস্ত।
যোগ লেখক Spudd86, উৎস

সুতরাং এটি স্পষ্টভাবে মাইক্রোসেকেন্ড বলে, কিন্তু বলে যে সিস্টেম ঘড়ির রেজুলেশন অনির্দিষ্ট। আমি এই প্রেক্ষাপটে রেজোলিউশন অনুমান করি কিভাবে সর্বদাই ক্ষুদ্রতম পরিমাণের পরিমাণ বাড়ানো হবে?

ডাটা স্ট্রাকচার মাইক্রোসেকেন্ডের পরিমাপের একটি ইউনিট হিসাবে সংজ্ঞায়িত করা হয়, কিন্তু এর মানে এই নয় যে ঘড়ি বা অপারেটিং সিস্টেমটি আসলেই মাপের পরিমাপ করতে সক্ষম।

অন্য লোকেদের মত সুপারিশ করা হয়, gettimeofday() খারাপ কারণ সময় সেট করার জন্য ঘড়ি ঘুর্ণন হতে পারে এবং আপনার গণনা বন্ধ করে দিতে পারে। clock_gettime (CLOCK_MONOTONIC) আপনি যা চান, এবং clock_getres() আপনাকে আপনার ঘড়ির স্পষ্টতা জানাবে।

0
যোগ
@ এমপিজে 0 এটি না
যোগ লেখক Spudd86, উৎস
তাই আপনার কোডে কি ঘটে যখন gettimeofday() ডেলাইট সঞ্চয় সঙ্গে এগিয়ে বা পিছনে জাম্প?
যোগ লেখক mpez0, উৎস
clock_gettime শুধুমাত্র নতুন লিনাক্সে বিদ্যমান। অন্যান্য সিস্টেম শুধুমাত্র gettimeofday আছে ()
যোগ লেখক vitaly.v.ch, উৎস

This answer mentions problems with the clock being adjusted. Both your problems guaranteeing tick units and the problems with the time being adjusted are solved in C++11 with the library.

ঘড়ি std :: chrono :: steady_clock সমন্বয় করা হবে না নিশ্চিত, এবং এটি বাস্তব স্থিতিকালের একটি স্থিতিশীল হারে অগ্রসর হবে, তাই SpeedStep- এর মত প্রযুক্তিগুলি এটি প্রভাবিত করবে না।

আপনি std :: chrono :: duration বিশেষীকরণগুলি যেমন std :: chrono :: microseconds এর মধ্যে একটি রূপান্তর করে typesafe ইউনিটগুলি পেতে পারেন। এই ধরনের টিক মান দ্বারা ব্যবহৃত ইউনিট সম্পর্কে কোন দ্ব্যর্থতা আছে। যাইহোক, মনে রাখবেন যে ঘড়ির অভাবে এই রেজল্যুশন আছে না। আপনি একটি নির্দিষ্ট সময়ের মধ্যে attoseconds রূপান্তর করতে পারেন প্রকৃতপক্ষে একটি ঘড়ি যা সঠিক।

0
যোগ

আরডিএসএসসি পড়তে এসএমপি সিস্টেমে নির্ভরযোগ্য নয়, যেহেতু প্রতিটি CPU তাদের নিজস্ব পাল্টা বজায় রাখে এবং অন্য কাউন্টারের সাথে সংশ্লিষ্ট সিঙ্ক্রোনাইজ করে প্রতিটি কাউন্টার নিশ্চিত হয় না।

আমি clock_gettime (CLOCK_REALTIME) চেষ্টা করার পরামর্শ দিতে পারি। Posix ম্যানুয়াল ইঙ্গিত করে যে এটি সমস্ত অনুবর্তী সিস্টেমের উপর প্রয়োগ করা উচিত। এটি একটি ন্যানসেকেন্ডের গণনা প্রদান করতে পারে, তবে প্রকৃতপক্ষে আপনার প্রকৃত রেজল্যুশনটি দেখতে দেখতে সম্ভবত আপনার সিস্টেমটি clock_getres (CLOCK_REALTIME) চেক করতে চাইবে।

0
যোগ
clock_getres (CLOCK_REALTIME) প্রকৃত রেজোলিউশন দেবে না। এটি hrtimers পাওয়া গেলে সর্বদা "1 এনএস" (একটি ন্যানোসেকেন্ড) ফিরে আসে, include / linux / hrtimer.h ফাইলের জন্য HIGH_RES_NSEC 1 (stackoverflow.com/a/23044075/196561 )
যোগ লেখক osgx, উৎস
0
যোগ