2015-03-30 12 views
1

我正在使用AVX內在函數,但由於除了基於_mm256的內在函數以外的其他所有內容,MSVC都會生成非-vex指令,所以我需要使用/ arch:AVX編譯整個源代碼。項目的其餘部分使用/ arch:SSE2進行編譯,以便它可以在較舊的CPU上運行,並且我正在手動檢查AVX是否可用。使用AVX體系結構編譯另一個SSE2源碼安全嗎?

包含AVX代碼的源代碼(爲AVX編譯)包含一個巨大的模板庫和其他東西,只是爲了讓它們定義。是否有可能編譯器/鏈接器決定使用AVX指令來實例化某些模板,僅僅因爲它也包含在這個源代碼中?在這種情況下,這將使其崩潰非AVX處理器

+0

您最好不要在具有不同編譯選項的模塊之間共享C++ - ish內容,以免違反單定義規則。像使用一個DLL那樣對待它,使用簡單的C接口來跨越邊界,除了各個模塊沒有用於extern鏈接的自己的命名空間外,所以你在內部使用C++的能力也受到限制。 – 2015-03-31 00:28:44

+0

我創建了一個希望回答你的問題的測試項目,但它沒有像我預期的那樣工作(模板似乎被實例化,認爲他們不需要)......我應該在幾個小時內回答這個問題,或者也許是開放的一個新的(有點不同)的問題... – 2015-03-31 01:34:28

+0

謝謝你們。事情是,如果可能/容易,我會做經典的「C」thingy,但它只是依賴於很多定義和東西,所以這是相當有問題的。而所有這些混亂只是因爲編譯器沒有辦法指定我想要「vex」指令...... @ Marc.2377請讓我知道你發現了什麼。 – 2015-03-31 11:39:40

回答

0

是否有編譯器/連接器決定實例 一些模板,AVX指令的可能性,只是因爲它已經包含在這個源 以及?

是的,它可能發生,如我的linked question所見。看看那裏給出的(其他)好的答案。

我的首選解決方法是修改模板以包含區分性參數,但如果它真的是一個「巨大的庫」,就像您在自己的答案中提到的那樣使用全局定義一樣,可能太麻煩了。