内側の2つのループ(k、l)を処理するカーネルを作成し、グローバルサイズがi、jの2Dカーネルとしてエンキューします。カーネルはの線に沿って何かだろう
:
__kernel void innerLoop(__global float* A, __global float* B, __global float* marry)
{
int i = get_global_id(1);
int j = get_global_id(0);
int marraytemp = 0;
for(int k=i*5;k<i*5+5;k++)
{
for(int l=j*5;l<j*5+5;j++)
{
marrytemp=A[i]+B[j]+marrytemp;
}
}
marry[i,j]=marrytemp;
}
そして、それはのようなものと呼ばれることになります。
clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&A);
clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&B);
clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *)&marray);
size_t global_item_size[] = {100, 100};
clEnqueueNDRangeKernel(command_queue, kernel, 2, NULL, &global_item_size, NULL, 0, NULL, NULL);
両方の
編集は、カーネルのアウトラインを追加しますこれらは追加のサポートコード(例えばcommand_queue
とkernel
の作成など)を必要とし、コンパイルされていません。 4つのネストされたループをOpenCLカーネルに分割する方法のアイデアを伝えるだけです。
大変ありがとうございます。 –
ありがとうございます。k、l?はどのように書くのですか? –
カーネルの概要と呼び出しコードが追加されました。 – Dithermaster