我已經實現了使用C++中的二維向量的矩陣類(vector<vector<float>>()
)。我現在想要使用openCL優化使用GPGPU的代碼。但我每遇到一個問題都會遇到問題。所以請幫助我,讓我這樣做的提示。如何將C++ std :: vector轉換爲openCL內核?
我的要求如下
- 因爲我想用這個矩陣庫來實現機器學習算法中可能存在巨大的矩陣,比如1000 * 400。
- 我可以使用二維矢量並將它們傳送到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;
}
}
我的原始想法是使用GPU設備進行矩陣乘法,以便我可以平行化代碼。 – Kasun 2014-09-10 19:15:26