OpenCL을 조사해 보니이 커널이 너무 천천히 실행되는 이유에 대해 조금 혼란 스럽습니다. 나는 임의의 값으로 포인터의 초기화 한 것을 제외하고,왜이 간단한 OpenCL 커널이 너무 느리게 실행됩니까?
char* out = new char[2048*2048];
cl::Buffer(
context,
CL_MEM_USE_HOST_PTR | CL_MEM_WRITE_ONLY,
length,
out);
저두 입력 버퍼 : 나는 다음과 같은 방법으로 버퍼를 만든
__kernel void copy(
const __global char* pSrc,
__global __write_only char* pDst,
int length)
{
const int tid = get_global_id(0);
if(tid < length) {
pDst[tid] = pSrc[tid];
}
}
: 여기에 커널입니다. 마지막으로, 커널이 방법을 실행 : 인텔 i5-3450과
cl_ulong startTime = event.getProfilingInfo<CL_PROFILING_COMMAND_START>();
cl_ulong endTime = event.getProfilingInfo<CL_PROFILING_COMMAND_END>();
std::cout << (endTime - startTime) * SECONDS_PER_NANO/SECONDS_PER_MILLI << "\n";
나는, 윈도우 7을 실행 해요 : 평균적으로
cl::Event event;
queue.enqueueNDRangeKernel(
kernel,
cl::NullRange,
cl::NDRange(length),
cl::NDRange(1),
NULL,
&event);
event.wait();
을에 의해 계산 된 시간은 약 75 밀리 초 칩 (샌디 브릿지 아키텍처). 비교를 위해 복사를 수행하는 "직접적인"방법은 5 밀리 초 미만입니다. 나는 event.getProfilingInfo가 호스트와 장치 사이의 통신 시간을 포함한다고 생각하지 않는다. 생각?
는 편집 : ananthonline의 제안에서
, 내가 대신 문자의 float4s를 사용하도록 커널을 변경하고 약 50 밀리의 평균 실행 시간을 떨어졌다. 아직도 내가 기대했던 것만 큼 빠르지는 않지만 개선점. 감사합니다 ananthonline!
어떤 구현입니까? 인텔 OpenCL 구현? 4-float 배열로 동일한 커널을 사용해 보셨습니까? 이것이 더 나은 메모리 액세스 패턴 일 수 있습니다. – Ani
그래, 인텔 OpenCL 구현. 나는 4-floats를 시도하지 않았다. 그것은 좋은 생각이다. 나는 그것을 들여다 볼 것이다. –
호기심에서, 어떻게 'clEnqueueCopyBuffer'가 수행됩니까? 그게 당신이 "직설"이라는 뜻인가요? – willglynn