簡體   English   中英

使用Intel HD Graphics 4000的OpenCL GPU編程

[英]OpenCL GPU Programming with Intel HD Graphics 4000

我一直在嘗試使用OpenCL c ++綁定(版本1.2)實現簡單的並行算法。 大致上是c代碼(沒有OpenCL):

typedef struct coord{
    double _x;
    double _y;
    double _z;
}__coord;

typedef struct node{
    __coord _coord;
     double _dist;
} __node;
double input[3] = {-1.0, -2, 3.5};
//nodeVector1D is a 1Dim random array of struct __node
//nodeVectorSize is the Size of the above array (>1,000)
double d = 0.0;
     for(int i=0; i < nodeVectorSize; i++){
         __node n = nodeVector1D[i];
         d += (input[0] - n._coord._x)*(input[0] - n._coord._x);
         d += (input[1] - n._coord._y)*(input[1] - n._coord._y);
         d += (input[2] - n._coord._z)*(input[2] - n._coord._z);
         n._dist = d;
     }

我使用2013年末推出的MacBook Pro 13“,在Mac Os X Lion上運行。OpenCL僅檢測CPU。CPU:Intel Ivy i5 2.6GHz,具有集成的1Gb GPU(1.6Ghz)(Intel HD Graphics 4000)。檢測到的最大組項目大小為1024個字節。當我運行上面的固定代碼(帶有1024個節點)時,大約需要17微秒。

當我使用C ++庫的OpenCL運行其並行版本時,它需要10倍的時間,大約是87微秒(不包括程序創建,緩沖區分配和寫入)。 我在這里做錯了什么?

注意:很明顯可以猜到該算法的OpenCL內核,但是我可以在需要時發布它。 提前致謝。

編輯N#1:內核代碼

__kernel void  _computeDist(
   __global void* nodeVector1D,
   const unsigned int nodeVectorSize,
   const unsigned int itemsize, 
   __global const double* input){
    double d = 0.;
    int i,c;
    double* n;
    i = get_global_id(0);
    if (i >= nodeVectorSize) return;
    n = (double*)(nodeVector1D + i*itemsize);
    for (c=0; c<3;c++){
        d += (input[c] - n[c])*(input[c] - n[c]);
    }
    n[3] = d;

}

抱歉,void指針算法有效,但有效(默認沒有seg)。 我也可以發布OpenCL初始化例程,但我認為它遍及Internet。 但是,如果有人問我,我會發布它。

@pmdj:正如我上面所說,OpenCL可以識別我的CPU,否則我將無法運行測試並獲得上面介紹的性能結果。

@pmdj:據我所知,OpenCL內核代碼始終以C編寫。但是,我標記了C ++,因為(如上所述),我正在使用OpenCL C ++綁定。

我終於找到了問題。 問題是Mac OS X上的OpenCL返回錯誤的最大設備工作組大小為1024。我對各種工作組大小進行了測試,最終發現每個組使用128個工作項時,性能提高了200%。 這是一個更清晰的基准圖。 IGPU代表集成GPU。 (X軸:數組大小,Y軸:持續時間(以微秒為單位)) 在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM