Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


2 questions online user: 31

0
votes
answers
37 views
+10

內存對齊保證

1

以下代碼可交叉編譯內存對齊保證

struct Foo { 
    alignas(1) char c1; 
    alignas(1) char c2; 
    alignas(4) int i; 
}; 
static_assert(sizeof(Foo) == (sizeof(int) + 4), "No cross-compilable"); 

換句話說,是保證sizeof(Foo) == (sizeof(int) + 4)不管什麼架構/平臺?

+0

嚴格來說?我會說不。我不相信對齊規範否定了填充選項。 – StoryTeller

+0

@StoryTeller我考慮到了'+ 4'(就是填充「+ 2」)。 –

+1

是的,就是這樣。填充沒有綁定,真的。不可能超過您指定的數量,但不是真正的約束。 – StoryTeller

沙发
0
2

不能保證。這將在今天的許多體系結構上工作,但在具有8字節int(在8字節邊界上對齊)的系統上這不起作用。在這種情況下,你應該得到一個編譯器診斷,因爲你試圖對int應用一個不太嚴格的對齊;看[dcl.align]。

+0

請問您能否提供更多關於爲什麼在「8字節int arch」上無效的細節? –

+0

@BiagioFesta如果一個'int'有8個字節的對齊,那麼'Foo'中'i'的偏移量將是8,並且sizeof(Foo)將是16. – 1201ProgramAlarm

+0

你是對的!那麼'alignof(int)+ sizeof(int)== sizeof(Foo)'會是正確的嗎? (注意:'int'的'alignas(4)'被刪除) –

0
votes
answers
26 views
+10

提示編譯器可以使用對齊的memcpy

3

我有一個由7個__m256值組成的結構,它存儲在內存中的32字節對齊。提示編譯器可以使用對齊的memcpy

typedef struct 
{ 
     __m256 xl,xh; 
     __m256 yl,yh; 
     __m256 zl,zh; 
     __m256i co; 
} bloxset8_t; 

我通過使用posix_memalign()函數動態分配的數據,或者使用用於靜態分配數據的(aligned(32))屬性實現32字節對齊。

對齊方式很好,但是當我使用兩個指向這樣一個結構體的指針,並將它們作爲memcpy()的目標和源代碼傳遞時,編譯器決定使用__memcpy_avx_unaligned()進行復制。

我該如何強制clang使用對齊的avx memcpy函數,而我認爲這是更快的變體?

操作系統:Ubuntu 16.04.3 LTS,Clang:3.8.0-2ubuntu4。

UPDATE
的__memcpy_avx_unaligned()複製兩個或更多個結構,當僅調用。當只複製一個時,clang會發出14個vmovup指令。

+0

未經測試,但值得一試:我認爲我之前通過在memcpy之前添加一個assert()來聲明地址是32字節對齊的。一些編譯器可以採取這些提示並使用它們進行優化。 –

+0

我無法用Clang 3.9重新編譯(我收到一堆'vmovaps'),不幸的是我無法嘗試3.8 – harold

+0

@harold如果您一次複製兩個或更多結構,則使用memcpy_avx_unaligned()。一個結構實際上是通過移動指令完成的,在我的情況下它是未對齊的:vmovup(並且它使用了其中的14個)。 – Bram

沙发
0
6

__memcpy_avx_unaligned只是一個內部的glibc函數名稱。這並不意味着有更快的__memcpy_avx_aligned函數。這個名字只是向glibc開發者傳達了這個memcpy變體是如何實現的。

另一個問題是,C編譯器使用四個AVX2加載/存儲操作發出memcpy的內聯擴展會更快。該代碼將比memcpy呼叫更大,但總體來說可能會更快。有可能幫助編譯器使用__builtin_assume_aligned builtin來做到這一點。

+0

謝謝。我注意到如果memcpy只有1個結構,則使用14條移動指令。我能夠強制他們從未對齊的移動到構造'__builtin_assume_aligned()'的對齊移動如果您可以添加對此的引用,我可以接受這個答案。 – Bram