আধুনিক ওপেনএমপি সমর্থন পেতে উইন্ডোতে সিএমকে কনফিগার করুন কমান্ড লাইন থেকে ক্ল্যাং ব্যবহার করতে


11

আমার একটি ছোট পরীক্ষা প্রকল্প রয়েছে যা সমান্তরালতার জন্য ওপেনএমপি ব্যবহার করে। আমার লক্ষ্য এটি সংকলন করে যাতে এটি উত্পাদন করে .dllএবং .libগ্রন্থাগারগুলির জন্য (কারণ আমার প্রকৃত প্রকল্পটি এই ধরণের ব্যবহার করে বিতরণ করা বাহ্যিক গ্রন্থাগারের সাথে লিঙ্ক করে), ওপেনএমপি 4.5 বা আরও নতুনটির জন্য সমর্থন করে এবং কমান্ড লাইন থেকে এটি করে যাতে এটি ডকরে করা যায় পরীক্ষা করা এবং পরীক্ষা করা (ডকার অংশটি এই প্রশ্নের ক্ষেত্রের বাইরে, এটি কমান্ড লাইন থেকে কেন কাজ করা দরকার তা কেবল উল্লেখের জন্য)। আমি এই প্রকল্পটি বিভিন্ন সংকলক দিয়ে সংকলন করতে পারি যার সাথে আমি খুশি নই:

  • এমএসভিসি:, mkdir build-msvcতারপরে cmake ..(নতুন তৈরি ফোল্ডার থেকে) এবং শেষ পর্যন্ত cmake --build . --config Release। এটি সূক্ষ্ম সংকলন করে তবে কেবল ওপেনএমপি ২.০ সমর্থন করে, সুতরাং আমার বাস্তব প্রকল্পের জন্য এটি ভাল বিকল্প নয়।
  • ইন্টেল সমান্তরাল স্টুডিও:, mkdir build-intelতারপরে cmake .. -T "Intel C++ Compiler 19.0"(সদ্য নির্মিত ফোল্ডার থেকে) এবং শেষ পর্যন্ত cmake --build . --config Release। এটি ওপেনএমপি 5.0 সমর্থন করে তবে এর লাইসেন্সগুলি আমার জন্য বেশ ব্যয়বহুল।
  • MinGW x64 g ++:, mkdir build-g++তারপরে cmake .. -G "MinGW Makefiles"(সদ্য নির্মিত ফোল্ডার থেকে) এবং শেষ পর্যন্ত cmake --build .। এটি ওপেনএমপি ৪.৪ সমর্থন করে তবে এই সংকলক .libআমার সাথে প্রয়োজনীয় যা আমি ইতিমধ্যে উল্লেখ করেছি (যতদূর আমি জানি) সাথে সামঞ্জস্যপূর্ণ নয় ।

ঝাঁকুনি ব্যবহার করতে আমি সাফল্য ছাড়াই চেষ্টা করেছি:

  • এমএসভিসি থেকে ক্ল্যাং করুন:, mkdir build-clang-msvcতারপরে cmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..(নতুন তৈরি ফোল্ডার থেকে), তবে এটি নিম্নলিখিত ত্রুটির সাথে ব্যর্থ হয়েছে:
- সিএসএক্সএক্স সংকলক সনাক্তকরণ এমএসভিসি -র মতো কমান্ড-লাইনের সাথে 8.0.1 কলম্ব
- সিএক্সএক্স সংকলকের কাজ করার জন্য পরীক্ষা করুন: সি: / প্রোগ্রাম ফাইলগুলি (x86) / মাইক্রোসফ্ট ভিজ্যুয়াল স্টুডিও / 2019 / সম্প্রদায় / উপাচার্য / সরঞ্জাম / এলএলভিএম / বিন / ঝনঝন-ক্লা.এক্সে
- সিএক্সএক্স সংকলক কাজ করার জন্য পরীক্ষা করুন: সি: / প্রোগ্রাম ফাইল (x86) / মাইক্রোসফ্ট ভিজ্যুয়াল স্টুডিও / 2019 / সম্প্রদায় / উপাচার্য / সরঞ্জাম / এলএলভিএম / বিন / ঝনঝন- cl.exe - ভাঙা
সিএমকে ত্রুটি সি: / প্রোগ্রাম ফাইল / সিএমকে / শেয়ার / cmake-3.15 / মডিউল / সিএমেকটেষ্টসিএক্সএক্সএক্সকম্পিলার.কম: 53 (বার্তা):
  সি ++ সংকলক

    "সি: / প্রোগ্রাম ফাইলগুলি (x86) / মাইক্রোসফ্ট ভিজ্যুয়াল স্টুডিও / 2019 / সম্প্রদায় / উপাচার্য / সরঞ্জাম / এলএলভিএম / বিন / ঝনঝন- cl.exe"

  একটি সাধারণ পরীক্ষা প্রোগ্রাম সংকলন করতে সক্ষম নয়।

  এটি নিম্নলিখিত আউটপুট সঙ্গে ব্যর্থ:

    দির পরিবর্তন করুন: সি: / ব্যবহারকারী / [ব্যবহারকারী নাম] / উত্স / রেপো / টেস্ট_পেনম্প / বিল্ড-ক্ল্যাং-এমএসভিসি / সিএমেকফিলস / সিএমকেটম্প

    রান বিল্ড কমান্ড (গুলি): সি: / প্রোগ্রাজি 2/MICROS~1/2019/COMMUN~1/Common7/IDE/COMMON~1/MICROS~1/CMake/inja/ninja.exe cmTC_bd131 && [1/2] বিল্ডিং সিএক্সএক্স অবজেক্ট সিএমকেফিলস \ সেমিটিসিটি_বিডি 131.dir \ টেস্ট সিএক্সএক্সএক্সকম্পিলার
    [2/2] সিএক্সএক্স এক্সিকিউটেবল সিএমটিসি_বিডি 131.exe লিঙ্ক করা
    FAILED: cmTC_bd131.exe
    cmd.exe / C "cd। &&" C: \ প্রোগ্রাম ফাইলগুলি \ সিএমকে \ বিন \ cmake.exe "-E বনাম_লিংক_এক্সে --intdir = সিএমকেফাইলস \ সেমিটিসি_বিডি 131.dir --rc = আরসি - এমটি = সিএমএকে_এমটি-নোটফাউন্ড - উদ্ভাসিত - সি: C প্রোগ্রা ~ 1 \ মিংডব্লিউ- ~ 1 \ এক্স 86_64 ~ 1.0-পি \ মিংডু \ 64 \ বিন \ এলডি.এক্স / নোলোগো সিএমকেফিলস \ সেমিটিসি_বিডি 131.dir \ টেস্টসিএক্সএক্সএক্সকম্পিলার.কম / বি.এল / সিটি_বিডি 13 ই x cmTC_bd131.lib /pdb:cmTC_bd131.pdb /version:0.0 / মেশিন: এক্স 86 / ডিবাগ / ইনক্রিমেন্টাল / সাবসিস্টেম: কনসোল কার্নেল 32.lib ব্যবহারকারী 32.lib gdi32.lib ওনসপুল.লিব শেল 32.লিব ওলিড 32.লিব ওলিড 32.লিব .lib advapi32.lib && cd। "
    আরসি পাস 1: কমান্ড "আরসি / ফোনে সিএমেকফিলস \ সেমিটিসি_বিডি 131.dir / manifest.res সিএমকেফিলস \ সেমিটিসি_বিডি 131.dir / manifest.rc" ব্যর্থ হয়েছে (প্রস্থান কোড 0) নিম্নলিখিত আউটপুট সহ:
    সিস্টেম নির্দিষ্ট ফাইল খুঁজে পাচ্ছি না
    নিনজা: বিল্ড বন্ধ হয়ে গেছে: সাবকম্যান্ড ব্যর্থ হয়েছে।





  সিএমকে এই প্রকল্পটি সঠিকভাবে তৈরি করতে সক্ষম হবে না।
কল স্ট্যাক (প্রথম সাম্প্রতিক কল):
  সিএমকেলিস্ট.টেক্সট: ২ (প্রকল্প)


- অসম্পূর্ণ কনফিগারেশন, ত্রুটি ঘটেছে!
"সি: / ব্যবহারকারী / [ব্যবহারকারী নাম] / / উত্স / রিপোস / টেস্ট_পেনম্প / বিল্ড-ক্লাং- এসএমসি / সি মেক ফাইলস / সি মেকআউটপুট.লগ" দেখুন।
"সি: / ব্যবহারকারী / [ব্যবহারকারী নাম]] / সোর্স / রিপোস / টেস্ট_পেনম্প / বিল্ড-ক্লাং- এসএমসি / সি মেক ফাইলস / সি মেকেরার.লগ" দেখুন।
  • এমএসভিসি বাদে ঝনঝন এবং নিনজা:, mkdir build-clang-ninjaতারপরে cmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..(সদ্য নির্মিত ফোল্ডার থেকে এবং PATHপরিবেশগত পরিবর্তনশীল যাতে নন-এমএসভিসি প্রথম পাওয়া যায়) থেকে পরিবর্তন করা যায় তবে এটি নিম্নলিখিত ত্রুটির সাথে ব্যর্থ হয়:
- সিএসএক্সএক্স সংকলক সনাক্তকরণ এমএসভিসি -র মতো কমান্ড-লাইনের সাথে 9.0.0 ঝাঁকুনি রয়েছে
- CXX সংকলক কাজ করার জন্য পরীক্ষা করুন: সি: / প্রোগ্রাম ফাইল / এলএলভিএম / বিন / ঝনঝন- cl.exe
- CXX সংকলক কাজ করার জন্য পরীক্ষা করুন: সি: / প্রোগ্রাম ফাইল / এলএলভিএম / বিন / ঝনঝন- cl.exe - ভাঙা
সিএমকে ত্রুটি সি: / প্রোগ্রাম ফাইল / সিএমকে / শেয়ার / cmake-3.15 / মডিউল / সিএমেকটেষ্টসিএক্সএক্সএক্সকম্পিলার.কম: 53 (বার্তা):
  সি ++ সংকলক

    "সি: / প্রোগ্রাম ফাইল / এলএলভিএম / বিন / ঝনঝন- cl.exe"

  একটি সাধারণ পরীক্ষা প্রোগ্রাম সংকলন করতে সক্ষম নয়।

  এটি নিম্নলিখিত আউটপুট সঙ্গে ব্যর্থ:

    দির পরিবর্তন করুন: সি: / ব্যবহারকারী / [ব্যবহারকারী নাম] / উত্স / রেপো / টেস্ট_পেনম্প / বিড-ক্ল্যাঞ্জ-নিনজা / সিএমেকফিলস / সিএমকেটম্প

    রান বিল্ড কমান্ড (গুলি): সি: / নিনজা / নিনজা.এক্সসিএমটিসি_50b73 && [1/2] বিল্ডিং সিএক্সএক্স অবজেক্ট সিএমকেফিলস \ সেএমটিসি_50 বি 73.dir \ টেস্টসিএক্সএক্সএক্সকমিলার সিএক্সএক্স.জ.জেজ
    [2/2] সিএক্সএক্স এক্সিকিউটেবল সিএমটিসি_50b73.exe লিঙ্ক করা
    FAILED: cmTC_50b73.exe
    cmd.exe / C "cd। &&" C: \ প্রোগ্রাম ফাইলগুলি \ সিএমকে \ বিন \ cmake.exe "-E vs_link_exe --intdir = CMakeFiles \ cmTC_50b73.dir --rc = আরসি - এমটি = CMAKE_MT- নোটফাউন্ড - উদ্ভাসিত - CMAKE_LINKER-NOTFOUND / nologo CMakeFiles \ cmTC_50b73.dir \ testCXXCompiler.cxx.obj /out:cmTC_50b73.exe /implib:cmTC_50b73.lib /pdb:CMC_50b73.pdb /version.0.0 / মেশিন: এক্সআরএনএস / মেশিন: সাবসিস্টেম: কনসোল কার্নেল 32.lib ব্যবহারকারী 32.lib gdi32.lib winspool.lib শেল 32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib অ্যাডাপি 32.lib &&d সিডি। "
    আরসি পাস 1: কমান্ড "আরসি / ফো সিএমেকফিলস \ সেমিটিসি_50b73.dir / manifest.res সিএমকেফিলস \ সেমিটিসি_50b73.dir / manifest.rc" ব্যর্থ হয়েছে (প্রস্থান কোড 0) নিম্নলিখিত আউটপুট সহ:
    সিস্টেম নির্দিষ্ট ফাইল খুঁজে পাচ্ছি না
    নিনজা: বিল্ড বন্ধ হয়ে গেছে: সাবকম্যান্ড ব্যর্থ হয়েছে।





  সিএমকে এই প্রকল্পটি সঠিকভাবে তৈরি করতে সক্ষম হবে না।
কল স্ট্যাক (প্রথম সাম্প্রতিক কল):
  সিএমকেলিস্ট.টেক্সট: ২ (প্রকল্প)


- অসম্পূর্ণ কনফিগারেশন, ত্রুটি ঘটেছে!
"সি: / ব্যবহারকারী / [ব্যবহারকারী নাম]] / সোর্স / রিপোস / টেস্ট_পেনম্প / বিড -ক্ল্যাং- এনঞ্জা / সি মেক ফাইলস / সি মেকআউটপুট.লগ" দেখুন।
"সি: / ব্যবহারকারী / [ব্যবহারকারী নাম]] / উত্স / রিপোস / টেস্ট_পেনম্প / বিড- ক্লেং- এনঞ্জা / সি মেকফিলস / সি মেকেরার.লগ" দেখুন।

ঝাঁকুনি দিয়ে কীভাবে এগিয়ে যাওয়া যায় সে সম্পর্কে কোনও ধারণা? আমার মনে হয় এটা আমি কি অর্জন (ফলে, OpenMP -র 4.5 অথবা ঊর্ধ্বতন সংস্করণ জন্য সমর্থন এবং প্রযোজনার সঙ্গে আমার পরীক্ষা প্রোগ্রাম কম্পাইল করতে চান তাদের জন্য আমার সেরা বিকল্প .libএবং .dll)।

সম্পর্কিত পোস্ট / ওয়েবপৃষ্ঠাগুলি যা আমি পরীক্ষা করে দেখেছি তবে এটি সমাধানে অকার্যকর ছিল:


আপনি কি কুমেক কমান্ড দেওয়ার আগে প্রাসঙ্গিক vcvarsXX.bat ফাইলটি লোড করার চেষ্টা করেছিলেন?
লে এনগক থুওং

আমার কোনও ধারণা নেই, তাই আমি অনুমান করি না। আমি কেবল একটি কমান্ড প্রম্পট খুলি, বিল্ড ফোল্ডারে নেভিগেট করি এবং সিএমকে যে আদেশগুলি লিখেছিলাম তা কার্যকর করি। আমি কীভাবে এই ফাইলটি লোড করতে পারি?
অ্যাপলোমার

1
আমি এমএসভিসি দিয়ে তৈরি একটি প্রকল্পের সাথে কাজ করছি। আমি যখনই প্রকল্পটি তৈরি করতে চাই, আমাকে সর্বদা "% VCINSTALLDIR% c vcvarsall.bat amd64" চালানো দরকার। এছাড়াও, এই পৃষ্ঠায় উত্তরের উপর ভিত্তি করে stackoverflow.com/questions/22585874/… । তিনি প্রস্তাবিত "প্রাসঙ্গিক vcvarsXX.bat ফাইলটি লোড করুন (যেমন" <আপনার ভিজ্যুয়াল স্টুডিও অবস্থান> \ ভিসি \ vcvarsall.bat "x86)"। আমি যখন ভিসিভারসাল.বাট চালাতে ভুলে যাই তখন আমি আপনার মতো একই ত্রুটির বার্তার মুখোমুখি হয়েছি
লে

এটি অবশ্যই আমাকে এগিয়ে নিয়ে যেতে পেরেছিল। এখন আমি পরবর্তী ধাপে এ আটকে am: Could NOT find OpenMP_CXX (missing: OpenMP_CXX_FLAGS OpenMP_CXX_LIB_NAMES)। আমি এই নতুন ত্রুটিটি খনন করব এবং উত্তর না পেলে আমি একটি নতুন প্রশ্ন পোস্ট করব। ধন্যবাদ!
অ্যাপলোমার

উত্তর:


4

আমি এই ত্রুটিটি কলং + এমএসভিসি মামলার নকল করতে সক্ষম হয়েছি । যেহেতু আমরা ভিজ্যুয়াল-স্টুডিওর তৈরি সংকলকটি ভিজ্যুয়াল স্টুডিওর (অর্থাৎ কমান্ড লাইন) বাইরে থেকে ব্যবহার করার চেষ্টা করছি, সংকলকটি ব্যবহারের আগে আমাদের কমান্ড লাইনে ভিএস বিল্ড এনভায়রনমেন্টটি শুরু করা প্রয়োজন । VCVarsXX.batফাইল এই কাজ করা সম্ভব; তারা ভিএস কমান্ড প্রম্পট সরঞ্জামগুলির অংশ। সুতরাং আপনার আর্কিটেকচারটি ( x86, x64ইত্যাদি) বাছাই করে এবং স্ক্রিপ্টটি চালানোর মাধ্যমে, এটি সিএমকে সহজ পরীক্ষা প্রোগ্রামটি তৈরি করে clang-clএগিয়ে যেতে দেয় allow এখানে এটি ভিএস 2019 এর জন্য অবস্থিত:

>"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x86

>cmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..
-- The CXX compiler identification is Clang 8.0.1
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/Llvm/bin/clang-cl.exe
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/Llvm/bin/clang-cl.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
...

ওপেনএমপি ইস্যুতে প্রসারিত করার জন্য, আমি ব্যক্তিগতভাবে find_package(OpenMP REQUIRED)বেশ ফলহীন হতে দেখেছি । যেমনটি আপনি উল্লেখ করেছেন, আমি এই সিএমকে ত্রুটিটিও পেয়েছি:

Could NOT find OpenMP_CXX (missing: OpenMP_CXX_FLAGS OpenMP_CXX_LIB_NAMES)

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

cmake_minimum_required (VERSION 2.8)
project(test_openmp LANGUAGES CXX)

set(OpenMP_CXX "${CMAKE_CXX_COMPILER}")
set(OpenMP_CXX_FLAGS "-Xclang -fopenmp")
set(OpenMP_CXX_LIB_NAMES "libomp" "libiomp5")
set(OpenMP_libomp_LIBRARY libomp)
set(OpenMP_libiomp5_LIBRARY libiomp5)

#OPENMP
find_package(OpenMP REQUIRED)
if(OPENMP_FOUND)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
endif()

# Library
add_library(example_lib SHARED example_lib.h example_lib.cpp)
target_link_libraries(example_lib PUBLIC ${OpenMP_CXX_LIBRARIES})
target_compile_definitions(example_lib PRIVATE EXEMPLE_LIB_EXPORT)

# Executable
add_executable(test_openmp test_openmp.cpp)
target_link_libraries(test_openmp example_lib)

এটি দ্বিতীয় সিএমকে কনফিগারেশন প্রয়াসের লাইব্রেরিগুলিকে "সন্ধান" করতে সফল হয়েছিল (প্রথম বারের Could NOT find OpenMP_CXXমতো আগের মতো একই ত্রুটি হয়েছিল):

>cmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..
-- Found OpenMP_CXX: -Xclang -fopenmp (found version "3.1")
-- Found OpenMP: TRUE (found version "3.1")
-- Configuring done
-- Generating done

তবে এটি এক্সিকিউটেবল তৈরি করতে ব্যর্থ হয়েছে, কারণ সিএমকে ওপেনএমপি ভেরিয়েবলগুলির (বিশেষত OpenMP_CXX_LIBRARIES) কোনওটিই লাইব্রেরির অবস্থানের দিকে নির্দেশ করে না point সিএমকেসের ত্রুটিগুলি এখানেFindOpenMP.cmake সিএমকে ইস্যু সাইটে উত্থাপিত হয়েছে এবং এলএলভিএম / কলংয়ের শেষেও প্রাসঙ্গিক সীমাবদ্ধতা রয়েছে বলে মনে হয়।


নির্বিশেষে, আমি যে উদাহরণটি কাজ করেছিলাম তার সবচেয়ে পরিষ্কার উপায়টি ছিল find_package()পুরোপুরি খাঁজ । নিম্নলিখিতটি আমাকে বিল্ডসিস্টেমটি সফলভাবে তৈরি করতে এবং নির্বাহযোগ্যকে সংকলন ও চালনার অনুমতি দিয়েছে:

cmake_minimum_required (VERSION 2.8)
project(test_openmp LANGUAGES CXX)

set(OpenMP_LIBRARY_DIR "C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/Llvm/lib")
set(OpenMP_CXX_FLAGS "-Xclang -fopenmp")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")

# Tell CMake where to find the OpenMP libraries.
link_directories(${OpenMP_LIBRARY_DIR})

# Library
add_library(example_lib SHARED example_lib.h example_lib.cpp)
# Link in the OpenMP libraries.
target_link_libraries(example_lib PUBLIC libomp libiomp5md)
target_compile_definitions(example_lib PRIVATE EXEMPLE_LIB_EXPORT)

# Executable
add_executable(test_openmp test_openmp.cpp)
target_link_libraries(test_openmp example_lib)

সিএমেক 3.17 এর জন্য সমর্থনটি অন্তর্ভুক্ত করে যা এই ত্রুটিটি সমাধান করে। ত্রুটি সংশোধন করা হয় এই কমিট।
অ্যাপলোমার

@ প্যালামার ধন্যবাদ! আপনি যদি আরও সাধারণ সমাধান জানেন তবে দয়া করে একটি পোস্ট করুন!
স্কয়ারস্কিটলস

দৌড়াদৌড়ি vcvarsall.batআমার জন্য প্যাথ-এ ঝাঁকুনি দেয় না। কোন ধারণা কেন?
অ্যালেক্স রিঙ্কিং

@ অ্যালেক্সারিংকি আপনি কি ঝনঝন-ক্লল ইনস্টল করেছেন? আপনার সেটআপটি এবং আপনি কীভাবে এই উপাদানগুলি ইনস্টল করেছেন তা না জেনে জানা শক্ত । আমি আপনাকে আরেকটি প্রশ্ন জিজ্ঞাসা করতে উত্সাহিত, যদি প্রয়োজন হয়!
স্কয়ারস্কিটলস

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