[英]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 ++綁定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.