我已經經歷了幾個例子,將一組元素減少爲一個元素,但沒有成功。有人在NVIDIA論壇上發佈了這個消息。我已經從浮點變量更改爲整數。OpenCL:縮小示例,並保留內存對象/將cuda代碼轉換爲openCL
__kernel void sum(__global const short *A,__global unsigned long *C,uint size, __local unsigned long *L) {
unsigned long sum=0;
for(int i=get_local_id(0);i<size;i+=get_local_size(0))
sum+=A[i];
L[get_local_id(0)]=sum;
for(uint c=get_local_size(0)/2;c>0;c/=2)
{
barrier(CLK_LOCAL_MEM_FENCE);
if(c>get_local_id(0))
L[get_local_id(0)]+=L[get_local_id(0)+c];
}
if(get_local_id(0)==0)
C[0]=L[0];
barrier(CLK_LOCAL_MEM_FENCE);
}
這種看法合適?第三個參數「大小」是否應該是當地工作規模或全球工作規模?
設置我的論點是這樣,
clSetKernelArg(ocReduce, 0, sizeof(cl_mem), (void*) &DevA);
clSetKernelArg(ocReduce, 1, sizeof(cl_mem), (void*) &DevC);
clSetKernelArg(ocReduce, 2, sizeof(uint), (void*) &size);
clSetKernelArg(ocReduce, 3, LocalWorkSize * sizeof(unsigned long), NULL);
第一個參數是輸入,我想從之前推出的內核的輸出保留。
clRetainMemObject(DevA);
clEnqueueNDRangeKernel(hCmdQueue[Plat-1][Dev-1], ocKernel, 1, NULL, &GlobalWorkSize, &LocalWorkSize, 0, NULL, NULL);
//the device memory object DevA now has the data to be reduced
clEnqueueNDRangeKernel(hCmdQueue[Plat-1][Dev-1], ocReduce, 1, NULL, &GlobalWorkSize, &LocalWorkSize, 0, NULL, NULL);
clEnqueueReadBuffer(hCmdQueue[Plat-1][Dev-1],DevRE, CL_TRUE, 0, sizeof(unsigned long)*512,(void*) RE , 0, NULL, NULL);
今天我打算嘗試將以下cuda縮減示例轉換爲openCL。
__global__ voidreduce1(int*g_idata, int*g_odata){
extern __shared__ intsdata[];
unsigned int tid = threadIdx.x;
unsigned int i = blockIdx.x*(blockDim.x*2) + threadIdx.x;
sdata[tid] = g_idata[i] + g_idata[i+blockDim.x];
__syncthreads();
for(unsigned int s=blockDim.x/2; s>0; s>>=1) {
if (tid < s) {
sdata[tid] += sdata[tid + s];
}
__syncthreads();
}
// write result for this block to global mem
if(tid == 0) g_odata[blockIdx.x] = sdata[0];
}
還有一個更優化的,(完全展開+多個每個線程元素)。
http://developer.download.nvidia.com/compute/cuda/1_1/Website/projects/reduction/doc/reduction.pdf
這可能使用的OpenCL?
灰熊給了我這個建議有一天,
」 ......使用的工作n個要素上,並將它們減少了像N/16(或任何其他數字)減少內核然後你。迭代調用該內核,直到你下降到一個元素,這是你的結果「
我想試試這個,但我不完全知道從哪裏開始,我想先得到一些東西上班。
這是很多很好的信息。再次感謝這樣一個真棒的答案。 – MVTC 2012-01-14 22:26:19
我收到一個錯誤,啓動內核,cl資源不足。 – MVTC 2012-01-15 01:10:04
它接縫我不能設置一個本地參數接近我的大小。 – MVTC 2012-01-15 01:32:39