使用蠻力匹配我已經存儲在字符數組a [正文長度],和圖案中的文本的數組b [patternLength]模式中的OpenCL
cl_char *a = (cl_char *) malloc(textLength*sizeof(cl_char));
for(int i =0; i<textLength;i++)
{
a[i]=text[i];
}
// A buffer object is a handle to a region of memory
cl_mem a_buffer = clCreateBuffer(context,
CL_MEM_READ_ONLY | // buffer object read only for kernel
CL_MEM_COPY_HOST_PTR, // copy data from memory referenced
// by host pointer
textLength*sizeof(cl_char), // size in bytes of buffer object
a, // host pointer
NULL); // no error code returned
// for text and pattern kernal arguments
cl_char *b = (cl_char *) malloc(patternLength*sizeof(cl_char));
for(int i =0; i<patternLength;i++)
{
b[i]=pattern[i];
}
// A buffer object is a handle to a region of memory
/*cl_mem b_buffer = clCreateBuffer(context,
CL_MEM_READ_ONLY | // buffer object read only for kernel
CL_MEM_COPY_HOST_PTR, // copy data from memory referenced
// by host pointer
patternLength*sizeof(cl_char), // size in bytes of buffer object
b, // host pointer
NULL); // no error code returned */
cl_mem b_buffer = NULL;
clSetKernelArg(kernel, 0, sizeof(a_buffer), (void*) &a_buffer);
clSetKernelArg(kernel, 1, sizeof(cl_mem), NULL);
clSetKernelArg(kernel, n, sizeof(cl_mem), &b_buffer);
size_t global_work_size = numberofWorkItem;
cl_int error= clEnqueueNDRangeKernel(queue, kernel,
1, NULL, // global work items dimensions and offset
&global_work_size, // number of global work items
&patternLength, // number of local work items
0, NULL, // don't wait on any events to complete
&timeEvent); // no event object returned
I have read that in clSetKernelArg, for __local indentifiers, the arg_value should be NULL. I have done that by doing b_buffer=NULL;
但是這樣做將防止b_buffer從存儲值b [](pattern) 我該怎麼做?
另外, 如果我沒有錯,local_work_size不能大於CL_DEVICE_MAX_WORK_ITEM_SIZES給出的值。因爲local_work_size受底層設備/硬件的約束。另一方面,global_work_size可以像任何人想要的那樣大。 是否必須是local_work_size的倍數? 如果是,爲什麼?
非常感謝你回答:) cl_mem b_buffer = NULL; clSetKernelArg(kernel,0,sizeof(a_buffer),(void *)&a_buffer); clSetKernelArg(kernel,1,sizeof(cl_mem),NULL); clSetKernelArg(kernel,n,sizeof(cl_mem),&b_buffer); 以上幾行錯了? 你能解釋一下如何分配本地內存嗎?如果它沒有被主機分配? – Remy 2012-07-12 19:58:04
您需要將數據作爲全局數據以及未初始化的本地緩衝區傳遞,並讓內核複製+使用數據。我發佈了上面顯示的內核代碼的更新。 – mfa 2012-07-13 04:04:32
謝謝.. :) 它清除了我的疑惑。謝謝! – Remy 2012-07-13 06:03:48