나는 몇 가지 예제를 통해 요소 배열을 하나의 요소로 축소하여 성공하지 못했습니다. 누군가가 이것을 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 reduction 예제를 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
커널을 시작하고 리소스를 제거하는 중 오류가 발생합니다. – MVTC
내가 가지고있는 크기에 가까운 곳에서 지역 주장을 설정할 수는 없다. – MVTC