মার্চ = নেটিভ কোন ফ্ল্যাগটি সক্রিয় করবে তা কীভাবে দেখবেন?


165

আমি আমার সি ++ অ্যাপ্লিকেশনটি জিসিসি ৪.৩ ব্যবহার করে সংকলন করছি। আমি যে অপটিমাইজেশন ফ্ল্যাগগুলি ব্যবহার করছি তা ম্যানুয়ালি নির্বাচনের পরিবর্তে -march=native, যা তাত্ত্বিকভাবে আমি যে হার্ডওয়ারটি সংকলন করছি তার জন্য প্রযোজ্য সমস্ত অপ্টিমাইজেশন পতাকা যুক্ত করা উচিত। তবে এটি কীভাবে পতাকা ব্যবহার করছে তা আমি কীভাবে যাচাই করতে পারি?

উত্তর:


150

আপনি -Q --help=targetবিকল্পগুলি ব্যবহার করতে পারেন :

gcc -march=native -Q --help=target ...

-vবিকল্পটি ব্যবহারের হতে পারে।

আপনি এখানে--help অপশনটিতে ডকুমেন্টেশন দেখতে পারেন ।


10
আমি সুপারিশ করতে যাচ্ছি এটি suboptimal। --Help = টার্গেটের আউটপুট সিপিইউ ক্যাশে তথ্য প্রদর্শন করে না, যার মধ্যে নীচে ইলিয়াস এবং 42n4 উভয় পদ্ধতি তালিকাভুক্ত করেছে। বিশেষত, একটি ফেনোমে জিসিসি 4.9.2 এ, আউটপুটটিতে এইগুলি অন্তর্ভুক্ত রয়েছে:--param l1-cache-size=64 --param l1-cache-line-size=64 --param l2-cache-size=512
ড্যানিয়েল

@ ড্যানিয়েলস্যান্টোস: আমার সিস্টেমে কমান্ড লাইনের -vঅংশ হিসাবে এটি অপশন সহ এই পরামিতিগুলি প্রদর্শন করে cc1...
থকালা

সঠিক না. জিসিসি সংস্করণ 5.4.0 এ (বিল্ড্রুট 2017.05-rc2-00016-gc7eaf50-নোংরা) এর বিনিময়ে ত্রুটি ঘটবে: এসেমব্লার বার্তা: ত্রুটি: অজানা আর্কিটেকচার নেটিভ ত্রুটি: অজানা বিকল্প -মার্চ = নেটিভ। সুতরাং, আলগা -march=nativeএবং এটি সর্বত্র কাজ করবে এখনই অনুসরণ: gcc -Q --help=target
ওলেগ কোকরিন

@ ওলেগ - এটি জিসিসি 5-তে বাগের মতো শোনাচ্ছে The বিষয়টি
জিসিসিতে

111

কমান্ড-লাইন পতাকা দেখতে, ব্যবহার করুন:

gcc -march=native -E -v - </dev/null 2>&1 | grep cc1

আপনি যদি নির্দিষ্ট পরামিতি দ্বারা নির্ধারিত সংকলক / প্রাকম্পম্পাইলার দেখতে চান তবে এটি করুন:

echo | gcc -dM -E - -march=native

1
এই উত্তরটির জন্য গ্রহণযোগ্য হিসাবে যতগুলি আপগ্রেস প্রাপ্য, বিশেষত, আসলে nativeকী সমান হয় তার তালিকাবদ্ধ ।
আইভিলনোটেক্সিস্ট আইডোনোটেক্সিস্ট

4
সুতরাং আমি যদি ক্রস-নেটিভ-সংকলন করতে চাই, আমার সংজ্ঞায়িত সংজ্ঞা এবং তর্কগুলি উভয়ই খাওয়ানো উচিত? বা যুক্তি কি যথেষ্ট?
hanshenrik

25

এটি হওয়া উচিত ( -###অনুরূপ -v):

echo | gcc -### -E - -march=native 

সিসির জন্য "আসল" নেটিভ ফ্ল্যাগগুলি প্রদর্শন করতে।

আপনি তাদের একটি আদেশ দিয়ে আরও "স্পষ্টভাবে" উপস্থিত করতে পারেন:

gcc -### -E - -march=native 2>&1 | sed -r '/cc1/!d;s/(")|(^.* - )//g'

এবং আপনি এর সাথে -ম্নো- * দিয়ে পতাকা মুক্ত করতে পারেন:

gcc -### -E - -march=native 2>&1 | sed -r '/cc1/!d;s/(")|(^.* - )|( -mno-[^\ ]+)//g'

10

আপনি যদি কোনও অ-নেটিভ ক্রস সংকলন সেট আপ করতে চান তা জানতে চাইলে আমি এই দরকারীটি পেয়েছি:

লক্ষ্য মেশিনে,

% gcc -march=native -Q --help=target | grep march
-march=                               core-avx-i

তারপরে এটি বিল্ড মেশিনে ব্যবহার করুন:

% gcc -march=core-avx-i ...

এটি দুর্ভাগ্যক্রমে সমস্ত পতাকা অন্তর্ভুক্ত করবে না।
ব্যাপটিস্ট উইচট

@ ব্যাপটিস্টিভিচ-তে এমন পতাকা রয়েছে যা-মার্চ = নেটিভের মধ্যে অন্তর্ভুক্ত থাকবে -মার্চ = কোর-অ্যাভেক্স-আমি এই ক্ষেত্রে না, বা কোন পতাকা? ধন্যবাদ!
রজারডপ্যাক

2
@rogerdpack এই কম্পিউটারে (স্যান্ডিব্রিজ), মার্চ = স্যান্ডিব্রিজটি মার্চ = নেটিভ করার সময় AVX সক্ষম করে না (কেন জানি না)। আর একটি গুরুত্বপূর্ণ পার্থক্য হ'ল ক্যাশে মাপগুলি কেবল মার্চ = নেটিভ দিয়ে বের করা হয়
ব্যাপটিস্ট উইচট

1
@ ব্যাপটিস্টউইচ এটির মতবিরোধজনক মনে হয় এখানে কাজ করবে (আমার ধারণা): echo | gcc-6 -dM -E - -march=sandybridge | grep AVX #define __AVX__ 1তবে ক্যাশে আকারগুলি অনুপস্থিত বলে মনে হয়।
রজারডপ্যাক

7

আমি এই প্রশ্নে আমার দুটি সেন্ট নিক্ষেপ করতে যাচ্ছি এবং ইলিয়াসের উত্তরটির আরও কিছুটা ভার্বোস বর্ধনের পরামর্শ দেব। জিসিসি ৪.। হিসাবে, দৌড়াদৌড়কপূর্ণ gcc -march=native -v -E - < /dev/nullঅতিরিক্ত -mno-*পতাকা হিসাবে স্প্যামের ক্রমবর্ধমান পরিমাণ নির্গত করে । নিম্নলিখিতগুলি এগুলি ছিটিয়ে দেবে:

gcc -march=native -v -E - < /dev/null 2>&1 | grep cc1 | perl -pe 's/ -mno-\S+//g; s/^.* - //g;'

যাইহোক, আমি কেবল দুটি পৃথক সিপিইউতে (একটি ইনটেল কোর 2 এবং এএমডি ফেনোম) এর যথার্থতা যাচাই করেছি, সুতরাং এই জাতীয় -mno-*পতাকাগুলি নিরাপদে ছড়িয়ে দেওয়া যেতে পারে তা নিশ্চিত করার জন্য আমি নিম্নলিখিত স্ক্রিপ্টটি চালানোর পরামর্শ দিই ।

#!/bin/bash

gcc_cmd="gcc"

# Optionally supply path to gcc as first argument
if (($#)); then
    gcc_cmd="$1"
fi

with_mno=$(
    "${gcc_cmd}" -march=native -mtune=native -v -E - < /dev/null 2>&1 |
    grep cc1 |
    perl -pe 's/^.* - //g;'
)
without_mno=$(echo "${with_mno}" | perl -pe 's/ -mno-\S+//g;')

"${gcc_cmd}" ${with_mno}    -dM -E - < /dev/null > /tmp/gcctest.a.$$
"${gcc_cmd}" ${without_mno} -dM -E - < /dev/null > /tmp/gcctest.b.$$

if diff -u /tmp/gcctest.{a,b}.$$; then
    echo "Safe to strip -mno-* options."
else
    echo
    echo "WARNING! Some -mno-* options are needed!"
    exit 1
fi

rm /tmp/gcctest.{a,b}.$$

আমি মধ্যে একটি পার্থক্য খুঁজে পেলাম না gcc -march=native -v -E - < /dev/nullএবং gcc -march=native -### -E - < /dev/nullকিছু প্যারামিটার উদ্ধৃত করা হচ্ছে অন্য চেয়ে - এবং প্যারামিটার কোন বিশেষ অক্ষর থাকতে, তাই আমি নিশ্চিত কি পরিস্থিতিতে এই কোনো বাস্তব পার্থক্য তোলে অধীনে নই।

অবশেষে, নোট করুন যেটি --march=nativeজিসিসি ৪.২ এ প্রবর্তিত হয়েছিল, এর আগে এটি কেবল একটি অজ্ঞাত যুক্তি।


ভাল, এই
gleans

জিসিসি সংস্করণ 5.4.0 (বিল্ড্রুট 2017.05-rc2-00016-gc7eaf50-নোংরা) ফিরে আসে: ত্রুটি: অজানা আর্কিটেকচার `নেটিভ '
ওলেগ কোকরিন

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