編寫內核來處理內部兩個循環(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
)並且尚未編譯。它們只是爲了讓你瞭解如何將你的四個嵌套循環分成OpenCL內核。
非常感謝你 –
但是如何寫k,l?你能不能寫出詳細的 –
內核和調用代碼的概要添加。 – Dithermaster