2014-04-17 5 views
0

OpenCL에서 데이터 병렬 처리를하고 있으며 벡터 명령 (SIMD)을 사용하여 처리량을 늘리고 싶습니다. int4, double2 등을 사용하려면 입력 데이터 배열을 빗어 내야합니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?벡터 명령 (OpenCL)을 위해 많은 양의 데이터를 준비하는 방법?

A[0] A[1] A[2] ... A[N] B[0] B[1] B[2] ... B[N] C[0]...C[N] D[0]...D[N] 

에서 하나 결합 된 버퍼 또는 별도의 것들

A[0] B[0] C[0] D[0] A[1] B[1] C[1] D[1] ... A[N] B[N] C[N] D[N] 

에 N이 20000만큼 큰 수, 지금은 배가됩니다. GCN GPGPU를 사용하고 있습니다. 선호하는 이중 벡터 크기는 2입니다.

- 특정 벡터 너비의 데이터를 조합하는 다른 커널을 준비해야합니까?

- CPU가 느린 속도로 진행된다고 가정합니다.

+0

트랜스 포즈 한 후 어떤 종류의 알고리즘을 실행할 것입니까? – mfa

답변

0

장치에 따라 OpenCL C 코드에서 벡터를 사용하도록 다시 작성하여 얻지 못할 수도 있습니다.

AMD의 이전 세대 하드웨어 (VLIW4/5)에서는 벡터 하드웨어를 사용한 유일한 시간이기 때문에 float4와 같은 벡터를 사용하여 승리 할 수있었습니다. 그러나 AMD의 새로운 하드웨어 (GCN)는 스칼라이고 컴파일러는 코드를 스칼라 라이즈합니다. 항상 스칼라였던 NVIDIA의 하드웨어와 동일합니다.

SSE/AVX 벡터 명령어를 사용할 수있는 CPU에서도 컴파일러가 코드를 스칼라 라이징하고 벡터 레인 (자동 벡터화)을 통해 여러 작업 항목을 실행한다고 생각합니다.

모든 것을 벡터화하기 전에 먼저 예제를 사용해보십시오.

대신 메모리 액세스가 완전히 통합되었는지 확인하는 데 집중할 수 있습니다. 그것은 대개 더 큰 승리입니다.