OpenCL (Xcode, Intel GPU)을 사용하고 있으며 이동 평균과 편차를 계산하는 커널을 구현하려고합니다. 다양한 길이의 여러 이중 배열을 커널에 전달하고 싶습니다. 구현이 가능합니까, 아니면 모든 배열이 같은 크기가되도록 더 작은 배열을 0으로 채워야합니까?
저는 OpenCL 및 GPGPU를 처음 사용하므로 명명법에 대한 저의 무지를 용서하십시오.
모든 버퍼를 커널에 전달할 수 있습니다. 커널이 모든 버퍼를 사용할 필요는 없습니다. 예를 들어 커널이 버퍼를 줄이면 .NET을 사용하여 런타임에 작업 항목 (축소 할 항목)의 양을 쿼리 할 수 있습니다 get_global_size(0)
. 그런 다음 적절한 매개 변수로 커널을 호출합니다.
예 (최적화되지 않음) :
__kernel reduce_step(__global float* data)
{
int id = get_global_id(0);
int size = get_global_size(0);
int size2 = size/2;
int size2p = (size+1)/2;
if(id<size2) //Only reduce up to size2, the odd element will remain in place
data[id] += data[id+size2p];
}
그러면 이렇게 부를 수 있습니다.
void reduce_me(std::vector<cl_float>& data){
size_t size = data.size();
//Copy to a buffer already created, equal or bigger size than data size
// ... TODO, check sizes of buffer or change the buffer set to the kernel args.
queue.enqueueWriteBuffer(buffer,CL_FALSE,0,sizeof(cl_float)*size,data.data());
//Reduce until 1024
while(size > 1024){
queue.enqueueNDRangeKernel(reduce_kernel,cl::NullRange,cl::NDRange(size),cl::NullRange);
size /= 2;
}
//Read out and trim
queue.enqueueReadBuffer(buffer,CL_TRUE,0,sizeof(cl_float)*size,data.data());
data.resize(size);
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다