প্রোগ্রামিয়ালি ক্যাশে লাইনের আকার পাবেন?


177

সমস্ত প্ল্যাটফর্ম স্বাগত, আপনার উত্তর জন্য প্ল্যাটফর্ম নির্দিষ্ট করুন।

একটি অনুরূপ প্রশ্ন: প্রোগ্রামিয়ালি সি ++ তে সিপিইউ ক্যাশে পৃষ্ঠার আকার কীভাবে পাবেন?


8
: FWIW, সি ++ 17 এই একটি কম্পাইল-টাইম পড়তা প্রদান করবে stackoverflow.com/questions/39680206/...
GManNickG

সি / সি ++ এর জন্য আলাদা করে রাখুন, যদি আপনি এই জাতীয় তথ্য পাওয়ার জন্য সমাবেশটি ব্যবহার করতে আপত্তি করেন না, আপনি এসডিএল 2 এর উত্স SDL_GetCPUCacheLineSizeকার্যকারিতাটিতে (নেগামার্টিনের উত্তর থেকে তথ্য প্রসারিত করতে পারেন) একবার দেখে নিতে পারেন, cpuid macroযার প্রতিটি ক্ষেত্রে সমাবেশের সোর্স কোড রয়েছে প্রসেসর মডেল। আপনি imgur.com/a/KP57m6s একবার দেখে নিতে পারেন , বা সরাসরি উত্সটিতে উঁকি দিতে পারেন।
হ্যাক্স্পোর

উত্তর:


186

লিনাক্সে (যুক্তিসঙ্গতভাবে সাম্প্রতিক কার্নেল সহ) আপনি / sys এর বাইরে এই তথ্যটি পেতে পারেন:

/sys/devices/system/cpu/cpu0/cache/

এই ডিরেক্টরিতে প্রতিটি স্তরের ক্যাশের একটি উপ-ডিরেক্টরি রয়েছে। এই ডিরেক্টরিগুলির প্রত্যেকটিতে নিম্নলিখিত ফাইল রয়েছে:

coherency_line_size
level
number_of_sets
physical_line_partition
shared_cpu_list
shared_cpu_map
size
type
ways_of_associativity

এটি আপনাকে ক্যাশে সম্পর্কে আরও তথ্য দেয় তবে আপনি কখনই ক্যাচলাইন আকার ( coherency_line_size) এর পাশাপাশি সিপিইউগুলি এই ক্যাশে ভাগ করে নেওয়ার বিষয়ে জানতে চাইবেন । আপনি যদি ভাগ করা ডেটা সহ মাল্টিথ্রেডেড প্রোগ্রামিং করেন তবে এটি খুব কার্যকর (থ্রেডগুলি ভাগ করে নেওয়ার ডেটাও ক্যাশে ভাগ করে নিলে আপনি আরও ভাল ফলাফল পাবেন)।


4
ফাইলগুলির মধ্যে কোনটি ক্যাশে লাইনের আকার ধারণ করে? আমি একত্রিত করছি_লাইন_ সাইজ? বা শারীরিক_লাইন_ভাগ?
paxos1977

27

6
নিশ্চিত হতে: এটি বাইটে আছে, হ্যাঁ?
জাকুব এম

6
হ্যাঁ, coherency_line_size বাইটে রয়েছে।
জন জুইনক

4
@ অ্যান্ড্রয়েড: আমি কোর-আই 5 প্রসেসরের সাথে ফেডোরা-18 x64 মেশিন ব্যবহার করি। আমার সিস্টেমে cat /sys/devices/system/cpu/cpu0/cache/index0/coherency_line_sizeফিরে আসে 64। সূচক 1,2,3 ফোল্ডারগুলির জন্যও।
আবিদ রহমান কে

141

লিনাক্সে সিসকনফ দেখুন (3)।

sysconf (_SC_LEVEL1_DCACHE_LINESIZE)

আপনি getconf ব্যবহার করে কমান্ড লাইন থেকে এটি পেতে পারেন:

$ getconf LEVEL1_DCACHE_LINESIZE
64

4
সহজ উত্তর কেবল সেরা!
ফ্র্যাঙ্কএইচ।

3
@warunapww এটি বাইটে রয়েছে।
মার্টেন বামেলিস

পরিশেষে! আশা করি আরও ছেলেরা সময় সাশ্রয়ের জন্য এই উত্তরটি দেখুন।
এলিনেক্স

118

আমি কিছু ক্যাশে লাইন স্টাফ নিয়ে কাজ করছি এবং ক্রস-প্ল্যাটফর্মের ফাংশনটি লেখার প্রয়োজন ছিল। আমি এটি https://github.com/NickStrupat/CacheLineSize এ গিথুব রেপোতে প্রতিশ্রুতিবদ্ধ করেছি , বা আপনি কেবল নীচের উত্সটি ব্যবহার করতে পারেন। আপনি এটি দিয়ে যা চান তা নির্দ্বিধায় করুন।

#ifndef GET_CACHE_LINE_SIZE_H_INCLUDED
#define GET_CACHE_LINE_SIZE_H_INCLUDED

// Author: Nick Strupat
// Date: October 29, 2010
// Returns the cache line size (in bytes) of the processor, or 0 on failure

#include <stddef.h>
size_t cache_line_size();

#if defined(__APPLE__)

#include <sys/sysctl.h>
size_t cache_line_size() {
    size_t line_size = 0;
    size_t sizeof_line_size = sizeof(line_size);
    sysctlbyname("hw.cachelinesize", &line_size, &sizeof_line_size, 0, 0);
    return line_size;
}

#elif defined(_WIN32)

#include <stdlib.h>
#include <windows.h>
size_t cache_line_size() {
    size_t line_size = 0;
    DWORD buffer_size = 0;
    DWORD i = 0;
    SYSTEM_LOGICAL_PROCESSOR_INFORMATION * buffer = 0;

    GetLogicalProcessorInformation(0, &buffer_size);
    buffer = (SYSTEM_LOGICAL_PROCESSOR_INFORMATION *)malloc(buffer_size);
    GetLogicalProcessorInformation(&buffer[0], &buffer_size);

    for (i = 0; i != buffer_size / sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION); ++i) {
        if (buffer[i].Relationship == RelationCache && buffer[i].Cache.Level == 1) {
            line_size = buffer[i].Cache.LineSize;
            break;
        }
    }

    free(buffer);
    return line_size;
}

#elif defined(linux)

#include <stdio.h>
size_t cache_line_size() {
    FILE * p = 0;
    p = fopen("/sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size", "r");
    unsigned int i = 0;
    if (p) {
        fscanf(p, "%d", &i);
        fclose(p);
    }
    return i;
}

#else
#error Unrecognized platform
#endif

#endif

15
লিনাক্সের জন্য সিসকনফ (_SC_LEVEL1_DCACHE_LINESIZE) ব্যবহার করা আরও ভাল।
ম্যাট

@ ম্যাট কেন? উৎসুক :-).
ব্যবহারকারী 35915

31

X86-এ, আপনি ক্যাশে এবং টিএলবি এর বিভিন্ন বৈশিষ্ট্য নির্ধারণ করতে ফাংশন 2 সহ সিপিইউডিআর নির্দেশিকা ব্যবহার করতে পারেন । ফাংশন 2 এর আউটপুট পার্সিং কিছুটা জটিল, তাই আমি আপনাকে ইন্টেল প্রসেসর সনাক্তকরণ এবং সিপিইউইড নির্দেশ (পিডিএফ) এর বিভাগ 3.1.3 উল্লেখ করব ।

সি / সি ++ কোড থেকে এই ডেটা পেতে, আপনাকে সিপিইউডি নির্দেশটি সম্পাদন করার জন্য ইনলাইন অ্যাসেমব্লী, সংকলক অভ্যন্তরীণগুলি বা কোনও বহিরাগত সমাবেশ ফাংশনটি কল করতে হবে।


ক্যাশে অন্তর্নির্মিত অন্য প্রসেসরের সাথে এটি কীভাবে করবেন সে সম্পর্কে যে কেউ জানেন?
paxos1977

3
@ সেরেটুলিস: এরর ... x86 ক্যাশে তৈরি করেছে। আপনি বিশেষত কোন "অন্যান্য প্রসেসর" খুঁজছেন? আপনি যা চাইছেন তা প্ল্যাটফর্ম নির্ভর।
বিলি ওনিল

9

আপনি যদি এসডিএল 2 ব্যবহার করেন তবে আপনি এই ফাংশনটি ব্যবহার করতে পারেন:

int SDL_GetCPUCacheLineSize(void);

যা এল 1 ক্যাশে লাইনের আকার, বাইটে দেয়।

আমার x86_64 মেশিনে, এই কোড স্নিপেট চালাচ্ছে:

printf("CacheLineSize = %d",SDL_GetCPUCacheLineSize());

উত্পাদন CacheLineSize = 64

আমি জানি যে আমি কিছুটা দেরি করেছি, তবে ভবিষ্যতের দর্শকদের জন্য কেবল তথ্য যোগ করছি। এসডিএল ডকুমেন্টেশন বর্তমানে বলেছে যে ফিরে আসা নম্বরটি কেবিতে, তবে এটি আসলে বাইটে।


ওহ আমার এই সত্যিই সহায়ক। আমি এসডিএল 2 তে কিছু গেম লিখছি তাই এটি সত্যিই দরকারী হতে চলেছে
নিকোলাস হামফ্রে

7

উইন্ডোজ প্ল্যাটফর্মে:

http://blogs.msdn.com/oldnewthing/archive/2009/12/08/9933836.aspx থেকে

গেটলজিকালপ্রসেসর ইনফরমেশন ফাংশন আপনাকে সিস্টেম দ্বারা ব্যবহৃত লজিকাল প্রসেসরের বৈশিষ্ট্য দেবে। রিলেশনক্যাশ টাইপের এন্ট্রি সন্ধান করে ফাংশনটি দিয়ে ফিরে SYSTEM_LOGICAL_PROCESSOR_INFORMATION আপনি হাঁটতে পারেন। এই জাতীয় প্রতিটি এন্ট্রিতে একটি প্রসেসরমাস্ক থাকে যা আপনাকে জানায় যে প্রসেসর (গুলি) এন্ট্রি প্রযোজ্য এবং CACHE_DESCRIPTOR এ এটি আপনাকে বলে দেয় কী ধরণের ক্যাশে বর্ণিত হচ্ছে এবং সেই ক্যাশের জন্য ক্যাশে লাইনটি কত বড়।


4

এআরএমভি and এবং এর উপরে C0বা ক্যাশে প্রকার রেজিস্টার রয়েছে। তবে এটি কেবল সুবিধাযুক্ত মোডে উপলব্ধ।

উদাহরণস্বরূপ, কর্টেক্স A -A8 প্রযুক্তিগত রেফারেন্স ম্যানুয়াল থেকে :

ক্যাশে প্রকারের নিবন্ধের উদ্দেশ্য হ'ল নির্দেশ এবং ডেটা ক্যাশে ন্যূনতম লাইনের দৈর্ঘ্য বাইটে নির্ধারণ করা যাতে ঠিকানাগুলিকে অবৈধ করতে সক্ষম হয়।

ক্যাশে প্রকারের নিবন্ধটি হ'ল:

  • কেবলমাত্র পঠনযোগ্য একটি রেজিস্টার
  • কেবল সুবিধাজনক মোডে অ্যাক্সেসযোগ্য।

ক্যাশে প্রকার নিবন্ধের বিষয়বস্তু নির্দিষ্ট প্রয়োগের উপর নির্ভর করে। চিত্র 3-2 ক্যাশে প্রকার রেজিস্টারের বিট ব্যবস্থাটি দেখায় ...


ধরবেন না যে এআরএম প্রসেসরের একটি ক্যাশে রয়েছে (স্পষ্টতই, কিছুগুলি একটি ব্যতীত কনফিগার করা যায়)। তা নির্ধারণ করা আদর্শ উপায় মাধ্যমে হয় C0। থেকে এআরএম এআরএম , পৃষ্ঠা B6-6:

এআরএমভি 6 থেকে, সিস্টেম কন্ট্রোল কোপরোসেসর ক্যাশে টাইপ রেজিস্ট্রার হ'ল এল 1 ক্যাশে সংজ্ঞায়িত করার বাধ্যতামূলক পদ্ধতি, পৃষ্ঠা B6-14 পৃষ্ঠায় ক্যাশে প্রকারের রেজিস্টারটি দেখুন। এটি স্থাপত্যের পূর্বের রূপগুলির জন্য প্রস্তাবিত পদ্ধতিও। এছাড়াও, পৃষ্ঠায় B6-12 পৃষ্ঠায় অতিরিক্ত স্তরের ক্যাশের জন্য বিবেচনাগুলি স্তরের 2 ক্যাশে সমর্থনের জন্য আর্কিটেকচার গাইডলাইন বর্ণনা করে।


3

আপনি কিছু সময় নির্ধারণের মাধ্যমে প্রোগ্রামগতভাবে এটি করার চেষ্টা করতে পারেন। স্পষ্টতই, এটি সর্বদা সিপিউড এবং পছন্দগুলির মতো যথাযথ হবে না তবে এটি আরও বহনযোগ্য। আটলাস এটির কনফিগারেশন পর্যায়ে এটি করে, আপনি এটি দেখতে চাইতে পারেন:

http://math-atlas.sourceforge.net/

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.