simd

    2熱度

    1回答

    我從來沒有寫過SSE優化的彙編代碼,所以很抱歉,如果這是一個菜鳥問題。在this aritcle解釋瞭如何使用條件語句矢量化for。然而,我的代碼(從here採取)的形式爲: for (int j=-halfHeight; j<=halfHeight; ++j) { for(int i=-halfWidth; i<=halfWidth; ++i) {

    1熱度

    1回答

    struct vec_struct { alias field this; bool b; int8 field; // ymm } SIMD字段,當你在用GDC生成的輸出64位的代碼似乎是做了很好的工作,因爲它已經得到了這個代碼的對齊偏移正確的256位YMM'字段'正確。 Q:D是否自動將字段上的對齊限制傳播到堆棧上靜態結構或結構的分配? 在這種情況下

    1熱度

    1回答

    我有一個向量,存儲在AVX寄存器中的元素{a0,a1,a2,a3}。現在,我想提出三點新的向量(也應該被存儲爲__m256d變量),可以說,b,c和d,包含以下元素: b = {a0,a1,a0,a0} c = {a1,a2,a2,a1} d = {a2,a3,a3,a2} 我怎樣才能做到這一點使用AVX?

    8熱度

    4回答

    這是我的想象,還是一個PNOT指令缺少SSE和AVX?也就是說,翻轉矢量中每一位的指令。 如果是,是否有更好的方法來模擬它,而不是PXOR與所有1的向量?很煩人,因爲我需要建立一個全1的矢量來使用這種方法。

    3熱度

    2回答

    我最近發現我的程序花費大部分時間在這個簡單的函數: void SumOfSquaredDifference( const uint8_t * a, size_t aStride, const uint8_t * b, size_t bStride, size_t width, size_t height, uint64_t * sum) { *sum = 0;

    0熱度

    1回答

    我得到一個奇怪的錯誤以下代碼: #include <assert.h> #include <stdio.h> #include <immintrin.h> inline static double myfma(double x,double y, double z) { double r; // result

    2熱度

    3回答

    所以,我想在C++中使用SIMD指令來比較uint32_t數組中的值,並將這些值存儲回新數組中。 它或多或少地正常工作,但我仍然使用4個if-clause來確定在SIMD指令後寫入的值是否寫回值。 有沒有辦法用SIMD指令來做到這一點? 函數allocateAlignedBuffer完成名稱所描述的工作並正常工作。 uint32_t* testFunc(uint32_t* arr, uint32_

    1熱度

    1回答

    根據this question我這次實現了水平加法5乘5和7乘7。它正確地完成工作,但速度不夠快。 它能比它更快嗎?我試圖使用hadd和其他指令,但改進受到限制。舉例來說,當我使用_mm256_bsrli_epi128時,它稍微好一點,但它需要一些額外的排列,因爲車道而損壞了好處。所以問題是如何實施以獲得更多的性能。相同的故事爲9個元件等 這增加了水平方向5個元素並將結果放置在地方0,5,和10:

    -1熱度

    1回答

    我想在一些項目中使用SIMD指令,一切工作正常,但我不能使用_mm_set1_epi32(x)命令(我仍然可以使用_mm_set_epi32(x,x,x, x),它工作正常),但只要我想使用其他來源的命令使用的代碼CodeGo.net,我得到一個「內存訪問錯誤」的消息(請原諒,我沒有正確的英文翻譯的錯誤,我試圖從德國那裏是Speicherzugriffsfehler)翻譯其 一些額外的信息: 我得

    2熱度

    1回答

    我想交換兩個256位向量A和B中的16位值。夢幻般的方法是找到一個內置指令來完成它。不幸的是,我找不到,我認爲這項工作沒有任何指示。諸如洗牌,置換,混合等指令保留或破壞目的地中的值。是什麼我在尋找如下: vector A : |a0|a1|a2|a3|a4|a5|a6|a7||a8|a9|a10|a11|a12|a13|a14|a15| Vector B : |b0|b1|b2|b3|b4|b5