2011-12-06 2 views
1

AES 암호 해독을 수행하는 코드를 작성하려고합니다. 코드는 작동하지만 암호 해독 후 XOR 연산을 수행해야하는 Cipher Block Chaining을 추가 할 수 있기를 원합니다.OpenCL clEnqueueTasks 병렬 처리

코드를 작성하고 이해하기 쉽게하기 위해 두 개의 커널을 사용하여 코드를 작성했습니다. 단일 블록에서 암호 해독을 수행하는 사람과 CBC 부분에 대해 XOR을 수행하는 사람. 그런 다음 Decryption과 XOR 사이의 이벤트에 의해 지정된 종속성을 가진 각 16byte 블록의 데이터에 대해 clEnqueueTask를 통해 대기열에 제출했습니다.

이것은 매우 느린 것으로 밝혀졌지만 올바른 순서로 처리하지만 실행을 병렬 처리하지는 않습니다.

세분성을 잃지 않고 성능을 향상시키는 이유 또는 방법을 아는 사람이 있습니까?

+0

이 함수는 CL1.2 버전에서 더 이상 사용되지 않으므로 rangeND 커널 호출 (http://stackoverflow.com/questions/36816301/clenquetask-showing-deprecated-in-opencl-2)에 대한 관련 호출로 대체해야합니다. -0) – StarShine

답변

0

clEnqueueTask를 통해 실행되는 커널은 본질적으로 단일 스레드입니다. 즉, 글로벌 작업 크기가 이고이 작업이이 단일 스레드에 대한 전체 계산 단위를 차지한다는 의미입니다. 일반적인 GPU에서는 8-16 개의 작업/작업 그룹 병렬 (CL_DEVICE_MAX_COMPUTE_UNITS)을 실행할 수 있고 작업 그룹에서는 256-1024 (CL_DEVICE_MAX_WORK_GROUP_SIZE)를 실행할 수 있기 때문에 성능에 현저한 영향을 미칠 수 있습니다. 따라서 전체 하드웨어를 사용할 수 없기 때문에 이론적 인 최대 15000x 대신 8-16x 병렬 처리를 구현할 수 있습니다.

1

clEnqueueTask은 일반적으로 단일 스레드 작업에 사용됩니다.

커널을 병렬로 실행할 수있는 경우 다른 매개 변수를 사용하여 clEnqueueTask 호출을 많이 호출하는 대신 clEnqueueNDRangeKernel 호출을 사용하십시오.

병렬 처리 성능이 좋지 않을 수있는 다른 요인은 많은 전역 메모리 액세스입니다. 계산량에 비해 커널에서 전역 메모리를 많이 읽거나 쓰는 경우 하드웨어에 따라 속도가 느려질 수 있습니다.