2016-08-11 2 views
3

나는 cuda를 배우고 있지만, 아직 cuda 장치에 액세스하지 못하고 있으며 일부 통합 메모리 동작에 대해 궁금합니다. 내가 아는 한, 통합 메모리 기능은 데이터를 호스트에서 장치로 전송하여 기본을 알아야합니다. 따라서 cpu가 gpu에서 데이터를 100 번 호출하면 첫 번째 시도에서만 데이터를 전송하고 gpu에서 해당 메모리 공간을 지 웁니다. (지금까지 올바른 나의 해석이다?)이 가정cuda 통합 메모리 : 메모리 전송 동작

1, GPU에서 맞게 의미 프로그래밍 구조가 장치 메모리에 비해 너무 큰 경우, 어떤 행동이의 UM은 몇 가지 최근에 액세스 교환합니다 데이터 구조는 계산을 완료하는 데 필요한 다음 공간을 만들거나 여전히 수동으로 수행해야합니까?

또한 메모리 전송 동작과 관련된 다른 것을 명확히 할 수 있다면 감사하게 생각합니다. 실제 데이터에 액세스하면 데이터가 뒤쪽으로 전송되지만 포인터에 액세스하는 것은 무엇입니까? 예를 들어 동일한 UM 포인터 (포인터의 데이터가 현재 GPP에 있고 다음 코드가 CPU에서 실행 됨)의 두 배열이 있고 첫 번째 배열을 슬라이스하여 요소를 삭제 한 경우 반복 새 배열에 배치되는 포인터를 한 단계 넘기면 데이터에 액세스하여 큐다 밈 전송을 수행 할 수 있습니까? 분명히 아니다.

답변

2

내가 알고있는 한, 통합 메모리 기능은 데이터를 호스트에서 장치로 전송하여 기본을 알아야합니다. 따라서 cpu가 gpu에서 데이터를 100 번 호출하면 첫 번째 시도에서만 데이터를 전송하고 gpu에서 해당 메모리 공간을 지 웁니다. (내 해석은 지금까지 정확합니까?)

첫 번째 부분은 정확합니다. CPU가 장치 메모리에있는 페이지에 액세스하려고하면 투명하게 주 메모리에서 전송됩니다. 장치 메모리의 페이지에 어떤 일이 벌어지는지는 구현 세부 사항 일 수 있지만 클리어되지 않을 수도 있습니다. 결국, 해당 내용은 으로 새로 고쳐야합니다. CPU가 페이지 에 쓰고, 장치가이면 다시 액세스해야합니다. NVIDIA의 누군가에게 물어보십시오.

이렇게 가정하면 gpu에 맞는 프로그래밍 방식 구조가 장치 메모리에 비해 너무 큰 경우 UM이 최근에 액세스 한 데이터 구조를 다음에 필요한 공간을 만들기 위해 교환합니다. 계산을 완료하거나 수동으로 수행해야합니까?

CUDA 8 전에, 아니, 당신은 장치에 들어갈 수있는 것보다 더 많은 (으로 과다)를 할당 할 수 없습니다. CUDA 8 이후로, 페이지가 장치 메모리에서 오류가 발생하거나 (아마도 LRU 정책을 사용하지만 어디에서나 지정되었는지는 확실하지 않습니다.) 그렇지 않으면 장치에 맞지 않는 데이터 집합을 처리 할 수 ​​있습니다 수동 스트리밍이 필요합니다.

실제 데이터에 액세스하면 데이터가 다시 전송되지만 포인터에 액세스하는 것은 무엇입니까?

정확히 동일하게 작동합니다. cudaMalloc (또는 심지어 malloc) 또는 어떤 포인터 내에서 그 데이터가 반환 된 포인터를 역 참조하는 경우에도 아무런 차이가 없습니다. 드라이버가 동일하게 처리합니다.

+0

아마도 마지막 질문에 대한 필자의 예가 너무 명확하지 않았기 때문에 포인터의 메모리를 비우는 것이 아닙니다. 즉, 동일한 UM 포인터를 가진 2 개의 배열이 있지만 첫 번째 양식에서 슬라이스를 원하는 모양으로 만듭니다. 실제 데이터는 해제 될 예정이 아니며 일부 포인터 재생이 발생하고 있습니다. 그런 행동에 대해 아는 것이 있습니까? – user2255757

+0

귀하의 의견을 이해할 수 없으며 아무 것도 공개하지 않았습니다. –

+0

죄송합니다. 귀하의 회신에 대한 시각화가 이상했습니다. 나는 당신이 생각했던 것을 확인했다고 생각합니다. 포인터로 재생해도 장치간에 메모리가 전송되지 않습니다. – user2255757