2011-02-27 3 views
0

, 나는이 구조체가 있다고 :
someheader.h 구조체는 C++ 응용 프로그램에서 장치 기능 액세스 구조체의 멤버 공유되고한다면 어떻게 CUDA는에CUDA에서 struct 멤버에 액세스 하시겠습니까? simpliflication를 들어

typedef struct 
{ 
    float x 
}someStruct; 

? 예를 들어

:

__global__ void stuff(someStruct *g) { 
    g[0].x = 0.4f; 
} 

올바른 방법은 그것을 할 것입니다? 그것은 작동하지 않는 것 같습니다.

+0

귀하의 질문은 명확하지 않습니다 ... 정확히 알고 싶습니까? 구조체 멤버에 대한 액세스는 평소처럼 발생합니다. –

+0

내 게시물을 업데이트했습니다. – ninjaneer

+0

네, 그게 올바른 방법입니다. 코드에 다른 문제가있을 가능성이 있습니다. – jmilloy

답변

1

구조 자체는 추상 엔티티이며 호스트 또는 장치 측에서 물리적 표현이 없습니다.

장치 측의 개체의 메모리 레이아웃은 호스트 측에서와 동일합니다 (실제로 묻는 것이라면). 따라서 호스트에서 장치로 큰 struct 개체를 안전하게 복사 할 수 있습니다.

개체 멤버에 액세스하는 것은 컴파일 타임에 올바른 오프셋을 계산하고 런타임에 개체 포인터 (this)에 추가하는 것입니다. CUDA는이를 완벽하게 수행 할 수 있습니다.

someStruct.x=2는 어셈블리 언어로 같은 무언가로 변환합니다 :

mov [someStruct]+0, 2 

0이 당신의 구조체 내부의 멤버 x의 오프셋된다.

업데이트 :

호스트와 디바이스 메모리 (한이 GPU의 다른, 당신의 RAM에) 별도의 완료됩니다. 공유되는 것은 없으며, 모든 것이 앞뒤로 전송되어야합니다 (상당한 시간이 소요될 수 있음). CudaMemcpy 기능을 사용하여 데이터를 복사하십시오.

+0

여기에 관련된 포인터가 없습니다 ... –

+0

모든 변수에는 주소가 있으므로 포인터를 가질 수 있습니다. – CygnusX1

+0

작동하지 않는 것 같습니다. 나는 그것을 시도했지만 호스트로 올바르게 다시 복사하지 않습니다. – ninjaneer

1

구조체 배열을 GPU로 전송해야합니다. 커널 내부 수레의 배열에 액세스 할 수 예를 들어, 당신은 물론 이것은 기본 지식

__global__ static void myKernel(float *val) 
{ 
val[0] = 0.4f; 
} 

int main() 
{ 
... 
cudaMemcpy(d_Val, h_Val, n * sizeof(float), cudaMemcpyHostToDevice); 
... 
} 

다음을 수행해야합니다. float를 모든 데이터 유형으로 대체하고 동일한 동작을 얻을 수 있습니다. 구조체는 사용자 정의 데이터 유형입니다.

커널에 대한 모든 입력이 GPU가 실행할 수있는 런타임 (카드에 따라 다름)에서 GPU 메모리 시스템의 일부로 푸시되기 때문에 이것은 단일 플로트 (따라서 단일 구조체)로 전송하는 것과 다릅니다 이 값에 액세스하십시오. 따라서 입력이 구조체 인 경우 커널이 커널에 액세스하려고 할 때 전체 구조체가 GPU에 상주합니다. 그러나 호스트에서 생성 된 structs에 대한 포인터를 보내면 GPU는 포인터의 값을 가지지 만 실제 데이터는 가져 오지 않습니다.

관련 문제