2016-07-02 1 views
2

OpenCL 및 CUDA에는 몇 년 동안 원자력 작업이 포함되었습니다 (물론 모든 CUDA 또는 OpenCL 장치가 이러한 기능을 지원하지는 않습니다). 그러나 - 제 질문은 비 원자 적 쓰기 때문에 인종과 함께 살 가능성에 관한 것입니다.GPU에서 비 원자 단위 쓰기에 대한 보장이 약합니까?

그리드의 여러 스레드가 모두 전역 메모리의 동일한 위치에 쓰여 있다고 가정합니다. 커널 실행이 끝났을 때 이러한 쓰기 중 하나의 결과가 일부 정크가 아닌 해당 위치에 나타날 것이라는 보장이 있습니까?

  • 메모리 공간 : (이미 대답을 얻었다 엔비디아 + CUDA를 제외한 모든 조합을 (선택), 편집)이 질문에 대한

    관련 매개 변수 글로벌 메모리 ; 이 질문은 로컬/공유/개인 메모리에 관한 질문이 아닙니다.

  • 정렬 : 단일 메모리 쓰기 폭 내에서 (예를 들어, 엔비디아 GPU에서 128 비트)
  • GPU 제조사 : AMD/엔비디아
  • 프로그래밍 프레임 워크 : 코드 저장 명령의 CUDA/OpenCL을
  • 위치 :의 같은 라인 모든 스레드/다른 코드 행에 대한 코드.
  • 쓰기 대상 : 함수 매개 변수/완전 동적 주소의 고정 주소/고정 오프셋
  • 쓰기 폭 : 8/32/64 비트.
+0

은 쓰레기가 아닙니다. 하드웨어 수준에서 여전히 원자 적입니다 - 데이터가 너무 커서 한 작업에서 쓰지 않는 한 스레드/SM 중 하나가 버스를 가져 와서 데이터를 쓰고 버스를 릴리스합니다. 칩 디자인과 관련된 태그를 추가 할 수 있습니다 – kangshiyin

답변

5

우리는 커널 실행이 체결 한 경우,이 쓰기 중 하나의 결과가 아니라 일부 정크보다, 해당 위치에 존재한다, 보장 있습니까?

CUDA GPU의 경우 OpenCL을 사용하는 NVIDIA GPU에 대해서는 확실하지만 대답은 '예'입니다. 아래의 대부분의 용어는 CUDA를 사용합니다. CUDA와 OpenCL 모두에 대해 철저한 답이 필요하다면 알려주십시오.이 대답은 삭제하겠습니다. 어쨌든 Very similar questions to this one은 물어 보았습니다. Here's another, 나는 다른 사람들이있을 것이라고 확신합니다.

같은 위치에 여러 개의 "동시"쓰기가 발생하면 그 중 하나가 그대로 유지됩니다.

어느 쪽이 승리 할 것인지는 정의되지 않습니다. 이기지 않은 쓰기의 동작은 정의되지 않습니다 (발생할 수도 있지만 승자로 대체되거나 전혀 발생하지 않을 수 있습니다). 메모리 위치의 실제 내용은 다양한 값 (예 : 원래 값 더하기 유효한 유효 값), 전송은 "정크"값 (즉, 이미 존재하지 않았고 어떤 스레드에 의해서도 쓰여지지 않은 값)을 통과하지 못합니다. 결국 전송은 "승자"로 끝납니다.

예 1 :

위치 X는 0을 포함합니다. 스레드 1,5,32, 30000 및 450000은 모두 해당 위치에 쓰십시오. 해당 위치에 대한 다른 쓰기 트래픽이 없으면 해당 위치에는 결국 하나의 값 (커널 종료시 또는 그 이전)이 포함됩니다.

예 2

위치 X 5. 스레드 32 X. 스레드에 1을 기록 포함 90,303 X. 스레드 432,322 7을 쓴다 X.에 972을 기록해당 위치에 대한 다른 쓰기 트래픽이 없거나 커널 종료시 위치 X는 1, 7 또는 972를 포함합니다. 5를 포함한 다른 값은 포함하지 않습니다.

X가 있다고 가정합니다. 이 원칙이 공유 메모리에도 적용 되기는하지만 전역 메모리에서 모든 트래픽은 자연스럽게 정렬되며 모든 트래픽은 동일한 크기입니다. 또한 장치 메모리 위치에 대한 naturally aligned traffic의 요구 사항과 같은 CUDA 프로그래밍 원칙을 위반하지 않았다고 가정합니다. 여기서 볼 수있는 트랜잭션은 단일 SASS 명령어 (스레드 당)에서 발생한 트랜잭션입니다. 이러한 트랜잭션의 너비는 1,2,4,8 또는 16 바이트 일 수 있습니다. 필자가 여기서 작성한 주장은 "코드의 동일한 줄"또는 "다른 줄"에서 쓰는지 여부에 관계없이 적용됩니다.

이것은 매우 복잡한 주제입니다 (특히 캐시 동작을 고려할 때, 그리고 혼합에서 읽기를 수행 할 때 예상되는 사항). "정크"값은 이 아닙니다.이 발생해야합니다. 전역 메모리에서 발생해야하는 유일한 값은 그곳에 있던 값이거나 일부 스레드에 의해 쓰여진 값입니다.

+0

답변이 nVIDIA + CUDA 케이스에 유용합니다. 저는 다른 대답에 관심이 있다는 것을 나타 내기 위해 답을 편집했습니다 (귀하의 가정을 포함 시키기도 함). – einpoklum

관련 문제