0

テキストをchar配列a[textLength]に格納し、patternを配列b[patternLength]に格納しました

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 [](パターン)の値を格納できなくなります。どうすればよいですか?

また、私が間違っていない場合、local_work_sizeはCL_DEVICE_MAX_WORK_ITEM_SIZESで指定された値より大きくすることはできません。local_work_sizeは、基盤となるデバイス/ハードウェアによって制約されているためです。一方、global_work_sizeは、必要なだけ大きくすることができます。local_work_sizeの倍数である必要がありますか?はいの場合、なぜですか?

4

2 に答える 2

0

エラーはclSetKernelArg行にあります。

//incorrect
clSetKernelArg(kernel, n, sizeof(cl_mem), &b_buffer);

//correct
clSetKernelArg(kernel, n, sizeof(cl_char)*patternLength, NULL);

ローカルメモリはカーネルの実行後にクリアされるため、メソッドを使用してb_bufferのコピーを取得することはできません。また、ローカルメモリはホストによって割り当てられていません。LDSに取り込むには、グローバルパラメータからコピーする必要があります。

ローカルデータをコピーするには、グローバルcl_memとローカルパラメータを渡す必要があります。コピーはカーネルの最後で実行でき、clEnqueueReadBufferを使用してホストに赤で戻すことができます。

アップデート

動的ローカルバッファを使用して、グローバルバッファの内容を割り当てる方法の具体例を次に示します。

__kernel void copyBufferExample(__global int* srcBuff, __local int* localBuff, const int copyCount)
{
    int lid = get_local_id(0);
    int ls = get_local_size(0);
    int i;

    for(i=lid; i<copyCount; i+=ls){
        localBuff[i] = srcBuff[i];
    }

    //use localBuff here
    //copy result back to global memory if needed
}
于 2012-07-12T11:36:17.913 に答える
0

上記のコードは並行してコピーを行いません...

これは...

_ kernel void copyBufferExample( _global int * srcBuff、__local int * localBuff、const int copyCount){

int i = get_local_id(0);

if(i <copyCount)localBuff [i] = srcBuff [i]; //各スレッドは1つのintをコピーします。forループは必要ありません

barrier(CLK_LOCAL_MEM_FENCE);  // synchronize all threads before using the local memory


//use localBuff here
//copy result back to global memory if needed

}

于 2012-07-17T03:17:36.943 に答える