2017-03-01 37 views
1
struct vec_struct { 
    alias field this; 
    bool b; 
    int8 field; // ymm 
    } 

SIMD字段,當你在用GDC生成的輸出64位的代碼似乎是做了很好的工作,因爲它已經得到了這個代碼的對齊偏移正確的256位YMM'字段'正確。d/DLang/GDC - 在結構

Q:D是否自動將字段上的對齊限制傳播到堆棧上靜態結構或結構的分配?

在這種情況下 -

struct vec_struct { 
    bool b2; 
    struct { 
     alias field this; 
     bool b; 
     int8 field; // umm 
     } 
    } 

看來該偏移量「字段」不再正確對齊 - 偏移在GDC 40個字節。我不認爲編譯器將僅使用未對齊的指令?無論如何,如果我已經理解了D文檔,我可以將字段的地址並將其傳遞給希望保證正確對齊的東西的人。 問題:這是正確的 - 一個嚴重的問題,或者我是愚蠢的?

請不要咬人。我都是D的新手,我希望我能理解x86 SIMD指令的文檔。 (非常經驗的專業asm和C程序員,但v過時。)

Noob q:我注意到GDC操作碼看起來有點奇怪,例如編譯器生成一個256位未對齊的提取後跟一個對齊二進制操作(我認爲),例如一個movdqu後面跟着一個vpaddd r,ymm ptr blah - 後者是隻對齊的嗎?道歉,如果我有這個錯誤,需要閱讀。 有人會友善地檢查我嗎?

+0

像vpaddd大多數操作(我沒有檢查一個特別)接受未對齊的內存操作數,它大多是具有嚴格對齊的變體的mov。 –

+0

謝謝馬克,我的無知 - 我假設太多了,所以除非我再看一遍,沒有證據表明這是代碼崩潰,因爲我看到的一些行爲顯然沒有對齊。它可能被認爲是非常不理想的,儘管在子結構錯誤對齊的情況下,畢竟它通常會嘗試對齊。 –

+0

這也可能是由規範施加的要求有問題。如果與某些C/C++編譯器兼容(哪個?)或者某個人的ABI規範是強制性的,那麼如果對齊問題得到解決可能會出現問題,但這當然意味着其他「治理」規範首先被破壞,所以也許誰在乎,也許這是不是一個有效的點。 –

回答

1

D是否自動將字段上的對齊限制傳播給堆棧上靜態結構或結構的分配?

我認爲它應該和GDC/LDC應該已經支持正確的堆棧對齊。 DMD可能有一些這方面的錯誤: https://issues.dlang.org/show_bug.cgi?id=16098

看來,偏移量爲「田」不再正確對齊 - 偏移量是在GDC 40個字節。

正如Iain已經在D.learn線程中回答的,這是共享DMD/GDC代碼庫中的一個錯誤。

錯誤報告:https://issues.dlang.org/show_bug.cgi?id=17237

DMD修正:https://github.com/dlang/dmd/pull/6582

反向移植了GDC:https://github.com/D-Programming-GDC/GDC/pull/408