2012-02-11 1 views
0

나는 인텔에 대해 벡터 레지스터가 최적화되어 있음을 알고 있습니다. SandyBridge 마이크로 아키텍처 (SSE + AVX), 그러나 NVIDIA의 GPU는 어떻습니까?OpenCL : NVIDIA의 벡터 레지스터 (float4, float8, ..) VS 인텔의 벡터 레지스터

일부 소스 코드는 벡터 레지스터를 사용하는 것이 NVIDIA의 GPU에서는 쓸모가 없다고 말하면서 어딘가에서 읽었습니다. 그러나 GPU에 벡터 레지스터가있는 프로그램을 실행하는 testrun이 있고 그 중 하나와 비교할 때 , 그들은 나에게 apx를 줬다. 1.7x 속도 향상.

참고로 인텔 CPU는 동일한 프로그램에서 1.25x 속도 향상을 제공합니다.

NVIDIA가 이러한 벡터 레지스터를 최적화한다면 누군가가 설명이나 소스를 읽어 줄 수 있습니까? 나는 그것을 문서화 할 때 필요하다. 감사.

+2

NVIDIA GPU의 성능 향상 가능성은 메모리 처리량에 있습니다. 하드웨어는 각 멀티 프로세서의 단일 트랜잭션에서 64 비트 및 128 비트 유형의 저장 및로드를 수행 할 수 있으므로 전체 대기 시간이 감소되고 유효 처리량이 증가합니다. – talonmies

+0

답장을 보내 주셔서 감사합니다. 16 개의로드/저장 유닛을 의미합니까? 각 유닛이 워프 당 128 비트 유형을로드/저장 할 수 있습니까? (따라서 16x128이됩니다.) 그렇지 않은 경우에는 그렇지 않습니다. 암시 적 벡터 레지스터 사용 (convert_floatn, vloadn 등)은 차이를 만듭니다. 더 빠른 속도 향상을 제공합니다. – ardiyu07

+0

예. 하드웨어는 워프 당 256 및 512 바이트 트랜잭션 크기를 처리 할 수 ​​있습니다. 이는 특정 레벨의 점유 수준에서 더 높은 대역폭 사용률을 초래할 수 있습니다. 효과를 설명하는 CUDA의 memcpy 커널 예제는 [이 슬라이드] (http://www.cs.berkeley.edu/~volkov/volkov10-GTC.pdf)의 슬라이드 35를 참조하십시오 (pdf 참고). – talonmies

답변

2

NVIDIA GPU의 성능 향상 가능성은 메모리 처리량에 있습니다. 하드웨어는 각 멀티 프로세서의 단일 트랜잭션에서 64 비트 및 128 비트 유형의 저장 및로드를 수행 할 수 있으므로 전체 대기 시간이 감소되고 유효 처리량이 증가합니다. 하드웨어는 워프 당 256 및 512 바이트 트랜잭션 크기를 처리 할 수 ​​있으므로 적절하게 정렬 된 워프에 대한로드/저장 요청은 단일 트랜잭션으로 처리 할 수 ​​있고 float8 두 트랜잭션에서로드/저장 요청을 처리 할 수 ​​있습니다. 이로 인해 특정 수준의 점유시 전역 메모리 대역폭 사용률이 높아질 수 있습니다. 메모리 처리량에 대한 유형 크기 (및 결과 트랜잭션 크기)의 영향을 보여주는 CUDA의 memcpy 커널 예는 UC Berkeley의 Vasily Volkov가 this presentation의 슬라이드 35를 참조하십시오.

+0

GPU가 계산을 위해 float4/...에서 SIMD 명령어를 실제로 사용하지 말라고 제안 하시겠습니까? – eudoxos

+2

@eudoxos : NVIDIA의 DX10/DX11 하드웨어 (CUDA 및 OpenCL을 실행할 수있는 하드웨어)의 ALU에는 'float4'와 같은 벡터 유형에서 작동하기위한 SIMD 산술 명령어가 없습니다. 그들은 순전히 스칼라 장치입니다. 벡터 유형에서 직접 수행 할 수있는 작업은 텍스처 하드웨어를 통한로드/저장 및 필터링뿐입니다. – talonmies