Re: [問題] 矩陣運算
※ 引述《stone0912 (開心石)》之銘言:
: 遇到的問題: (題意請描述清楚)
: 矩陣運算耗費太久的時間
: 舉例說明:
: EX1: ~矩陣運算~
: int A[62][62][34];
: for (int i=-90;i<=90;i++){
: for (int j=-90;j<=90;j++){
: for (int iii=1;iii<=61;iii++){
: for (int jjj=1;jjj<=61;jjj++){
: for (int kkk=1;kkk<=33;kkk++){
: A[iii][jjj][kkk]=(iii+jjj)/kkk }}}}}
: 就需要10多秒~
: ======================================================================
: EX2: ~矩陣累加~
: int A[62][62][34];
: int main(){
: for (int i=-90;i<=90;i++){
: for (int j=-90;j<=90;j++){
: for (int iii=1;iii<=61;iii++) {
: for (int jjj=1;jjj<=61;jjj++) {
: for (int kkk=1;kkk<=33;kkk++) {
: A[iii][jjj][kkk]=A[iii][jjj][kkk]+(iii+jjj)/kkk; }}}}}
: 則需20多秒~
: 是否有針對"矩陣運算" 及 "矩陣累加"進行時間改善的方法???
: 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux)
: VC++
關於這種龐大卻邏輯簡單的運算
我之前曾經玩過類似的東西 做個簡單的經驗分享 也希望強者不要鞭太大力
前面幾篇文章大家都有提到CUDA的優勢 GPU在這種簡單的運算擁有非常強大的優勢
不過要花個幾千塊買一張顯示卡
另外也有人提到BLAS 使用別人已經最佳化的lib 基本上效率極有可能倍數成長
小時候對於GFLOPs 很感興趣 想要用自己寫的簡單加乘運算來達到理論值
結果卻很受挫 號稱數十GLOPs的CPU 用簡單的for-loop寫 通常了不起 1~5 GLOPs
Compiler的最佳化效果也很有限 根本連一半的GLOPs都達不到
後來自己依照CPU cache的大小稍微改寫一下 效率就倍增了
不過離理論值總是還有一大段距離
後來挖了個 intel MKL(math kernel library)來用 印象中真的可以逼近理論值
跟自己最佳化過後的code比 又再次倍增
最後用簡單的幾句話總結一下
有錢 + 有時間 -> CUDA
沒錢 + 沒時間 -> 找個lib來用比較實在
當然 程式複雜度也許可以思考一下 是不是真的一定得要硬幹
也許有更簡化的算法? 或者是直接把結果存起來重複使用
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 219.87.64.222
討論串 (同標題文章)