simd

    1熱度

    1回答

    我一直在使用Vector進行實驗來使用HW來平行整數運算。有什麼辦法來啓用向量操作溢出檢查? 一個示例是將兩列(等長陣列)的整數相加在一起。這裏c=a+b意味着c[0] = a[0] + b[0],c[1] = a[1] + b[1]等 我想我可以做這樣的事情: overflow[i] = b[i] >= 0 ? c[i] < a[i] : c[i] >= a[i]; 但這(分支)可能會比淨的

    1熱度

    1回答

    我對x86_64內在函數不熟悉,我想使用256位向量寄存器進行以下操作。 我正在使用_mm256_maddubs_epi16(a,b);然而,似乎這個指令有溢出問題,因爲char * char可能超過16位的最大值。我有問題了解_mm256_unpackhi_epi32和相關說明。 任何人都可以詳細說明我並告訴我目的地的燈光?謝謝! int sumup_char_arrays(char *A, c

    1熱度

    1回答

    (這個問題可能與「沒有軟件推薦」規則調情;我理解爲什麼它可能會被關閉)。 在他們的論文F_2 Lanczos revisited,Peterson和MONICO給一個版本的Lanczos算法的用於查找在Z/2Z的線性映射的內核的子空間。如果我粗略地閱讀他們的論文是否正確(不管它是否顯然不是SO的問題),所提出的算法需要多次迭代,這些迭代的縮放與所使用機器的字大小成反比。作者以64位字大小實現了概念

    1熱度

    1回答

    是否可以告訴編譯器vector[index]對於特定索引有128位內存對齊方式? 或者,我們不能用索引做到這一點,並且必須用指針來做到這一點?

    2熱度

    1回答

    我有一個歸零的128位寄存器,我想向左移位並添加一個字節。我可以把它與: pslldq xmm0, 1 ......但現在我想複製到空的空間。例如: or xmm0, al 哪個當然不起作用。我只想要最低8位受影響。這將在一個循環中,將使用al的連續值來填充寄存器。所以我需要某種mov指令或其他選擇。 理想的是一個單一的指令左移8位並插入,但我不認爲這樣的存在。 我花了很多時間在x86-6

    1熱度

    1回答

    我正在嘗試使用英特爾SIMD內在函數來加速查詢答案程序。假設query_cnt依賴於輸入,但始終小於SIMD寄存器計數(即,有足夠的SIMD寄存器來保存它們)。由於查詢是我的應用程序中的熱門數據,而不是每次需要時加載它們,我可以首先加載它們並將它們始終保存在寄存器中? 假設查詢是float類型,並支持AVX256。現在,我必須使用類似: std::vector<__m256> vec_querie

    1熱度

    1回答

    我試圖清除浮點除零標誌忽略該異常。我期待與標誌設置(沒有改變我相信的默認行爲,並在下面註釋),我的錯誤處理程序將觸發。然而,_mm_div_ss似乎沒有提高SIGFPE。有任何想法嗎?從上面的代碼 #include <stdio.h> #include <signal.h> #include <string.h> #include <xmmintrin.h> static void si

    1熱度

    1回答

    我使用boost::simd作爲我的程序。奇怪的是,與沒有使用boost::simd相比,整個程序的運行速度實際上更慢。我設法追查導致絕大多數CPU運行時的行: using pack_t = boost::simd::pack<double>; using logical_pack_t = boost::simd::pack<boost::simd::logical<double>, pack_

    3熱度

    1回答

    版本代碼未矢量化,而版本B代碼已矢量化。 如何使版本A向量化並保持變量範圍(不使用文字範圍)? 嵌套循環是用於乘法與廣播,如在Python和MATLAB的numpy庫。 numpy圖書館的廣播描述是here。 版A碼(沒有的std ::向量。無向量化。) 此只使用imull (%rsi), %edx在.L169,這不是一個SIMD指令。 gcc godbolt #include <iostream

    1熱度

    2回答

    讓我們開始通過包括以下內容: #include <vector> #include <random> using namespace std; 現在,假設一個具有以下三個std:vector<float>: N = 1048576; vector<float> a(N); vector<float> b(N); vector<float> c(N); default_random