2012-09-19 1 views
0

오늘 전역 메모리 버퍼가 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는 무작위로 그리고 독립적으로 구현됩니까?

답변

0

질문 끝에 "PS"가 올바른 경로에 있습니다.

OpenCL 장치의 포인터 값은 장치 구현 정의이며 특정 장치에서 단일 커널 호출의 수명 동안 만 의미가 있습니다. 구현시 커널 호출에서 커널 호출까지 동일한 버퍼에 대해 다른 기본 주소를 사용하는 것이 합법적입니다 (구현이 실제 실제로이 작업을 수행하지 않을 수도 있음).

따라서 전역 메모리 포인터를 전역 메모리를 사용할 때, 포인터 값이 커널의 끝을 넘어서는 유효하다고 기대해서는 안됩니다.

+0

답변 해 주셔서 감사합니다. 귀하의 설명에 합당한 것으로 보입니다. 중재자는 AMD 포럼에서 OpenCL 메모리 모델의 일관성이 일정하기 때문에 여러 장치에서 사용하는 버퍼의 경우 런타임이이를 사용하여 각 장치의 메모리에 복사하여 더 빠른 액세스 속도를 갖기 때문에 주소가 다를 수 있다고 말했다. 하지만 APU 메모리에 적용되는 것은 아니라고 생각합니다. "퓨전 (Fusion)"이라는 기능이 있기 때문에 APU 메모리에만 적용됩니다. 당신의 이해는 나에게있어 매우 도움이됩니다. Tks! – acekiller