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


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.