2014-09-10 29 views
0

我已經實現了使用C++中的二維向量的矩陣類(vector<vector<float>>())。我現在想要使用openCL優化使用GPGPU的代碼。但我每遇到一個問題都會遇到問題。所以請幫助我,讓我這樣做的提示。如何將C++ std :: vector轉換爲openCL內核?

我的要求如下

  1. 因爲我想用這個矩陣庫來實現機器學習算法中可能存在巨大的矩陣,比如1000 * 400。
  2. 我可以使用二維矢量並將它們傳送到opencl內核(因爲如果我可以使用矢量來實現這個類,它將比使用數組從頭開始實現這些更容易)。

我的一個代碼段在我的籽粒要做到這一點,如下所示,在這裏我嘗試添加10到每一個元素。

但輸出顯示它只改變第一個向量[0] [n]元素的值。

這是我的主機程序段....

int in_vec_size = 100; 
int out_vec_size = 100; 

vector<vector<float>> in_vec(10,vector<float>(10)); 
vector<vector<float>> out_vec(10, vector<float>(10)); 
int k = 0; 

//initialize the input vec 
for (int i=0; i < 10;i++) 
{ 
    for (int j = 0; j < 10;j++) 
    { 
     in_vec[i][j] = k++; 
     out_vec[i][j] = 0; 
    } 
} 

//creating bufferes 
cl::Buffer inBuff(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, in_vec_size*4, &in_vec[0][0]); 
cl::Buffer outBuff(context, CL_MEM_WRITE_ONLY, out_vec_size*4, NULL); 

//set kernal args 
kernal.setArg(0, inBuff); 
kernal.setArg(1, outBuff); 
kernal.setArg(2, in_vec_size); 

cl::CommandQueue queue(context, devices_gpu[0]); 

queue.enqueueTask(kernal); 
queue.enqueueWriteBuffer(inBuff, CL_TRUE, 0, in_vec_size*4, &in_vec[0][0]); 
queue.enqueueReadBuffer(outBuff, CL_TRUE, 0, out_vec_size*4, &out_vec[0][0]); 

for (int i = 0; i < 10; i++) 
{ 
    for (int j = 0; j < 10; j++) 
    { 
     cout << out_vec[i][j] << endl; 
    } 
} 

__kernel void add(__global float*in,__global float*out,int x) 
{ 
    // i=get_global_id(0); 
    for(int i=0;i<x;i++) 
    { 
     out[i] = in[i]+10; 
    } 
} 
+0

我的原始想法是使用GPU設備進行矩陣乘法,以便我可以平行化代碼。 – Kasun 2014-09-10 19:15:26

回答

4

您使用multdimensonal載體。

這意味着,外部向量以連續方式包含內部向量。但內容是一個類,而不是一個普通的數據。因此,您用來初始化OpenCL內存對象的數據不是連續的。您可以使用矢量類實現數據而不是矩陣數據來初始化cl_mem。

改爲使用大小爲MxN的單個向量。看看this SO questionon

+0

好吧,我明白了。 – Kasun 2014-09-10 19:41:28

相關問題