2014-09-02 3 views
4

CUDA 및 OpenCL과 같은 언어를 사용하는 GPGPU가 있으므로 멀티미디어 SIMD 확장 (SSE/AVX/NEON)이 여전히 용도로 사용됩니까?GPGPU를 사용하는 이유는 무엇입니까?

SSE 지침을 사용하여 네트워크 정렬을 가속화하는 방법에 대한 최근 기사를 읽었습니다. 나는 이것이 꽤 산뜻하다고 생각했지만, 내 comp arch 교수에게 웃었고 비슷한 코드를 GPU에서 실행하면 SIMD 버전이 파괴 될 것이라고 말했다. 나는 SSE가 매우 간단하고 GPU가 훨씬 더 병렬성이 큰 매우 복잡한 가속기이기 때문에 이것을 의심하지 않지만, 멀티미디어 SIMD 확장이 GPU를 사용하는 것보다 더 유용한 시나리오가 많이 있다고 생각합니까?

GPGPU가 SIMD를 중복하는 경우 인텔이 SIMD 지원을 늘리는 이유는 무엇입니까? SSE는 128 비트 였지만 이제는 AVX에서 256 비트이고 내년에는 512 비트가됩니다. GPGPU가 데이터 병렬 처리 기능을 갖춘 더 나은 처리 코드라면 인텔은 왜 이러한 SIMD 확장을 추진하고 있습니까? 그들은 더 큰 캐시 및 분기 예측기에 동등한 자원 (연구 및 영역)을 넣을 수 있으므로 직렬 성능을 향상시킬 수 있습니다.

왜 GPGPUs 대신 SIMD를 사용합니까?

+1

FWIW, 인텔은 SIMD 크기를 GPU 너비와 동일한 크기 (또는 더 긴 지점)로 늘리려는 모든 의도를 갖고있는 것으로 보입니다. 즉 CPU와 GPU를 병합합니다. – Mysticial

+0

@Mysticial 아 맞습니까? 내가 읽을만한 참고 자료가 있니? – jonfrazen1

+0

인텔의 OpenCL 구현은 SSE 및 AVX를 사용하여 최적화하고 사실상 상당한 속도 향상을 제공합니다 (Xeon Phi가 아닌 CPU에서). SIMD/AVX/NEON은 아무데도 가지 않고 배경을 벗어납니다. 그들은 아마도 다양한 프론트 엔드 (예 : OpenCL)에서 무거운 짐을 싣고있을 것입니다. –

답변

6

절대적으로 SIMD는 여전히 관련이 있습니다.

첫 번째로 SIMD는 동일한 메모리를 직접 읽고 쓸 수 있기 때문에보다 쉽게 ​​스칼라 코드와 상호 운용 할 수 있으며 GPU는 액세스하기 전에 데이터를 GPU 메모리에 업로드해야합니다. 예를 들어, SIMD를 통해 memcmp()와 같은 함수를 벡터화하는 것은 간단 합니다만, 데이터를 GPU에 업로드하고 실행하여 memcmp()를 구현하는 것은 터무니 없습니다. 대기 시간이 갈거야.

두 번째로, SIMD와 GPU는 모두 높은 분기 코드에서 좋지 않지만 SIMD는 다소 나쁘지 않습니다. 이는 GPU가 단일 명령어 디스패처 아래에 여러 스레드 (워프)를 그룹화하기 때문입니다. 그렇다면 스레드가 다른 경로를 사용해야 할 때 어떤 일이 발생합니까? 분기가 한 스레드에서 수행되고 else 분기가 다른 스레드에서 수행되는 경우 어떻게됩니까? 이를 "분기 분기"라고하며 속도가 느립니다. "if"스레드가 대기하는 동안 "else"스레드가 대기하는 동안 모든 "if"스레드가 실행되고 "else"스레드가 실행됩니다. 물론 CPU 코어에는 이러한 제한이 없습니다.

결론적으로 "중간 작업 부하 :"워크로드는 중간 크기, 일부 데이터 병렬 처리, 액세스 패턴의 예측 불가능 성, 일부 분기점 등으로 SIMD가 더 좋습니다. GPU는 예측 가능한 실행 흐름과 액세스 패턴을 가진 매우 큰 작업 부하에 더 좋습니다.

은 (또한의 CPU에서 부동 소수점 배정 밀도에 대한 더 나은 지원과 같은 일부 주변 이유가있다.)

+0

통찰력을 가져 주셔서 감사합니다. GPU에 데이터를 "업로드"하는 요령에 대해서. AMD의 Accelerated Processing Units는 CPU 코어와 동일한 다이에서 GPGPU를 통합 한 것처럼 보입니다. 세부 사항은 잘 모르겠지만 L2 또는 L3 캐시를 공유한다고 생각합니다. 이 주장이 이와 같은 장치에도 적용된다고 생각하십니까? – jonfrazen1

+0

CUDA/OpenCL에서 분기 분기를 가져 와서 "CPU 코어"에 이러한 제한이 없다고 말합니다. 이것은 불공정 한 진술입니다. 먼저 SIMD 명령어가 코어별로 실행됩니다. SIMD 코드에서 if/else 문을 사용할 수 없습니다. 데이터 압축을 풀고 별도로 작업을 수행해야하는데, 이는 분기 분기와 비교할 때 나쁘거나 나쁠 수 있습니다. –

+0

나는 이와 비슷한 질문을하고있다. 나는 GPU가 기본적으로 느린 "코어"를 가진 넓은 너비의 SIMD 디바이스라고 생각 했습니까? SIMT는 하드웨어가 아닌 소프트웨어적인 것이 아닙니다. 나는 각각의 "트레드"가 다르게 보이지만 SIMD를 사용하고 있으며 SIMD 유닛의 다른 쓰레드는 다른 쓰레드를 기다려야한다는 것을 의미한다. 나는 AVX와 함께'mm256_movemask_epi8'를 사용하여 이와 같은 것을합니다. –

0

GPU는 제어 전용 캐시를 가지고, CPU가 더 나은 분기 있습니다. 그 외에도 컴퓨팅 성능은 SIMD 폭, 정수형 코어 밀도 및 명령어 수준의 병렬 처리에 의존합니다.

또 다른 중요한 매개 변수는 데이터가 CPU 또는 GPU와 얼마나 멀리 떨어져 있는지입니다. (데이터가 개별 GPU의 OpenGL 버퍼 일 수 있으며 CPU로 계산하기 전에 RAM에 다운로드해야 할 수도 있습니다. 호스트 버퍼가 RAM에 있고 개별 GPU에서 계산해야 할 때 동일한 효과가 나타날 수 있습니다)

+0

글쎄, 정렬 예제에서 정렬 된 배열을 나중에 CPU에서 사용하는 경우 유용 할 수 있다고 생각했습니다. 그러나 내 교수는 GPU에 그것을주고 다시 정렬하는 것이 더 낫다고 생각합니다. 그의 연구는 GPGPU에 관한 것이므로 편견이 있다고 생각하지만, 여전히 ... 나는 의심의 여지가있다. – jonfrazen1

+0

정렬 할 어레이의 길이는 얼마이며 정렬의 복잡성은 무엇입니까? –

관련 문제