2016-12-21 1 views
1

opencl을 사용하는 법을 배우고 있습니다. 이제는 하나의 큰 배열을 다른 배열로 복사하는 작업이 매우 간단합니다. a [301] [300] [300] [b] [301] [300] [300]. 그것은 제가 글로벌 워크 사이즈와 로컬 워크 사이즈가 무엇인지 이해하게하는 시험 일뿐입니다. 그리고 SVM을 사용하여 float8 벡터 배열을 커널에 전달합니다.OpenCL 전역/로컬 작업 크기 선택

__global float8* dts, 
__global float8* dts_from_file 

1 그것은 내가 내 테스트 케이스에서 글로벌 작업 크기> 배열의 크기를 선택해야 할 것 같다

size_t globalWorkSize[3] = { 128, 128, 256 }; 

(128 * 128 * 256 * 8)> 301 * 300 * 300 그렇지 않으면 잘린 출력이 나옵니다. 세계 작업 규모의 정의에 대해 옳은가 아니면 혼란 스럽습니까? FYI,

CL_DEVICE_ADDRESS_BITS=64 
    CL_DEVICE_MAX_WORK_GROUP_SIZE=256 
    CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS=3 
    CL_DEVICE_MAX_WORK_ITEM_SIZES[0,1,2]=256, 256, 256 

2는 CL_KERNEL_WORK_GROUP_SIZE = 256에 의해 한정되는 로컬 워크 크기는?

size_t localWorkSize[3] = { 4,8,8 }; 

늘어나는만큼 큰 값 4로 변경, clEnqueueNDRangeKernel 에러 CL_INVALID_WORK_GROUP_SIZE 때문에 4 * 8 * 8 = 256이 될 것인가?

3. 여러 장치 (CPU + GPU)의 글로벌/로컬 작업 크기는 어떻습니까? 각 장치마다 다른 작업 크기를 지정해야합니까?

미리 감사드립니다.

+0

어떤 종류의 장치가 CL_DEVICE_MAX_WORK_ITEM_SIZES을 256 x 256 x 256으로 제한합니까? 내가 본 대부분의 사람들은 적어도 8192 x 8192 x (무언가) 이상을 가지고 있습니다. – Dithermaster

답변

0

로컬 작업의 총 크기는 CL_DEVICE_MAX_WORK_GROUP_SIZE을 초과 할 수 없으며 CL_DEVICE_MAX_WORK_ITEM_SIZES 개를 초과 할 수 없습니다. 지역 작업 크기 {4, 8, 8}을 사용하는 경우에는 괜찮습니다.
글로벌 작업 크기는 로컬 작업 크기의 배수 여야합니다. 당신의 커널 프로세스 데이터의 한 조각, 당신은 당신의 배열 크기보다 더 큰 글로벌 작업 크기를 설정하고, 각 항목에 더 많은 데이터를 처리 할 수 ​​나오긴의이

if (get_global_id(0) < array_size_x) { ... } 

같은 커널 내부 검사를 추가해야 할 때 확인해야 다른 경우에는 다르게.

각 장치는 작업 크기가 다르므로 독립적으로 설정해야합니다. 동시에 여러 장치가 동일한 커널을 실행하게하는 것은 쉬운 일이 아닙니다.