2013-07-30 34 views
1

我已經看到了類似這樣的問題的其他答案,「快速memcpy」,和其他人的意見,「弄清方式副本」...我有一個程序有點像這樣,現在我想優化......它有1024個字節塊的memcpy多線程,也使用agner霧的asmlib擠壓性能,但受限於內存的速度。內存到內存的傳輸優化,如何不memcpy?

你能給如何複製,它可以比在某些情況下memcpy更快的例子嗎?

+4

那麼,爲什麼你需要複製它?它從哪裏來,它到底在哪裏? –

+1

/* memcpy(dest,source,size); */ –

+1

這顯然取決於你在做什麼,具體是什麼,爲什麼你要複製,所以請更具體一些。也就是說,在最近的一臺機器上,我預計1千字節的拷貝幾乎與讀取1千字節一樣快(寫入每個字節只需要幾次循環就可以訪問緩存),並且回寫處理主要內存當你不在尋找時 - 延遲問題不大,帶寬充足)。 – delnan

回答

0

沒有看到任何代碼,這很難明確回答。這聽起來像是你正在讀512字節數據的兩個扇區到一個1024字節的緩衝區中,但是你希望額外的64字節被附加到數據的末尾。

分配的1088個字節的緩衝區,引導你的讀入偏移0和偏移緩衝器512,然後開始在偏移1024

更新與64個字節的數據緩衝。如果你想另一個線程有這個沒有memcpy的數據然後傳遞指向1088緩衝區開始的指針。

希望這接近你的應用程序正在做的事情。

+0

謝謝你的答覆,是的,這是我正在做的,但問題是,多個線程正在訪問1024byte塊,但每個線程都將每個自己的64byte數據附加到1024byte塊的末尾,因爲同步不是一個選項,我現在的問題是將指針交換到1024byte塊而不會破壞每個線程附加的數據(64byte),我現在正在做的是將整個1024塊轉移到每個線程的預分配私有緩衝區,然後從那裏改變64byte ...因此沒有碰撞... –

+0

*「因爲同步不是一個選項」* - 爲什麼同步不完全是一個選項?我的意思是,沒有很多選擇;要麼你同步寫入,要麼就像你現在正在做的事情一樣,給每一個線程一個副本來處理,最後把它合併回去。 –

+0

@FlorentinoTuason,你可以做的是爲每個線程分配一個64字節的獨特塊,並讓它們在運行時填充它。你可能會想要一個字節數組,每個線程一個字節,這樣當線程填充了它的64個字節時,它將把該字節設置爲1.當數組中的所有字節都爲1時,所有的插槽都有被填滿。因此,通過具有大規模並行存儲「箱」來避免同步。 – JackCColeman

0

如果您的進程在多處理器環境中處理內存,您可以檢查NUMA體系結構。

我不知道NUMA是否會影響胎面。如果沒有,我可以建議你檢查你正在使用的CPU架構是如何工作的。