오늘 전역 메모리 버퍼가 OpenCL에 할당되고 저장되는 방법을 테스트하려고하지만 결과가 혼란 스럽습니다. 전역 메모리 버퍼를 생성하여 커널에 전달했지만,이 커널은 CPU와 GPU 장치 모두에 내장되어 있습니다. 그러나이 버퍼의 첫 번째 절반은 CPU에 할당하고 나머지 절반은 GPU에 할당합니다. 다른 오프셋은 다른 것을 나타냅니다. CPU와 GPU의 시작점으로 시작하므로 CPU와 GPU는 동일한 버퍼에서 동시에 작동 할 수 있지만 다른 위치에서 작동합니다. 그런 다음 커널에서 & 버퍼 [offset + tid]를 사용하여 버퍼의 각 요소의 주소를 얻고 주소를 다시 저장합니다. 나는 CPU로 다시 버퍼 및 값을 출력 보내면전역 메모리와 여러 장치 간의 일치하지 않는 주소 공간 매핑으로 인해 혼동 됨
__kernel void foo(__global uint * buffer, const uint offset)
{
uint tid = get_global_id(0);
buffer[offset+tid] = &buffer[offset+tid];
}
, 나는 CPU 커널에 의해 반환 된 주소 값이 연속이며 어떤 GPU에 의해 반환하는 것도 연속이지만,이 두 주소 공간은 연속하지 않은 것을 발견 서로 서로 함께. 나는 CPU와 GPU가 같은 버퍼에서 작업하고 있다고 생각한다. 왜 버퍼의 후반부의 주소가 전반부와 연속적이지 않은가? 하나의 장치 (CPU 또는 GPU) 만 사용하면 모든 주소가 올바르게 연속됩니다. 이 문제를 해결할 수있는 사람이 있습니까? GPU 메모리의 기본 개념에 대한 오해 일 수도 있으므로 자세한 해석이 필요합니다.
추신 :이 방법으로 이해할 수 있습니다. 물리적으로 버퍼가 하나 밖에 없지만 전역 메모리는 실제로 불투명 한 구조이지만 주소 변환은 & 사이이므로 서로 다른 장치에서 반환되는 주소 값이 달라집니다. 글로벌 메모리와 CPU, 글로벌 메모리와 CPU는 무작위로 그리고 독립적으로 구현됩니까?
답변 해 주셔서 감사합니다. 귀하의 설명에 합당한 것으로 보입니다. 중재자는 AMD 포럼에서 OpenCL 메모리 모델의 일관성이 일정하기 때문에 여러 장치에서 사용하는 버퍼의 경우 런타임이이를 사용하여 각 장치의 메모리에 복사하여 더 빠른 액세스 속도를 갖기 때문에 주소가 다를 수 있다고 말했다. 하지만 APU 메모리에 적용되는 것은 아니라고 생각합니다. "퓨전 (Fusion)"이라는 기능이 있기 때문에 APU 메모리에만 적용됩니다. 당신의 이해는 나에게있어 매우 도움이됩니다. Tks! – acekiller