우리는 커널 실행이 체결 한 경우,이 쓰기 중 하나의 결과가 아니라 일부 정크보다, 해당 위치에 존재한다, 보장 있습니까?
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 바이트 일 수 있습니다. 필자가 여기서 작성한 주장은 "코드의 동일한 줄"또는 "다른 줄"에서 쓰는지 여부에 관계없이 적용됩니다.
이것은 매우 복잡한 주제입니다 (특히 캐시 동작을 고려할 때, 그리고 혼합에서 읽기를 수행 할 때 예상되는 사항). "정크"값은 이 아닙니다.이 발생해야합니다. 전역 메모리에서 발생해야하는 유일한 값은 그곳에 있던 값이거나 일부 스레드에 의해 쓰여진 값입니다.
은 쓰레기가 아닙니다. 하드웨어 수준에서 여전히 원자 적입니다 - 데이터가 너무 커서 한 작업에서 쓰지 않는 한 스레드/SM 중 하나가 버스를 가져 와서 데이터를 쓰고 버스를 릴리스합니다. 칩 디자인과 관련된 태그를 추가 할 수 있습니다 – kangshiyin