2016-07-10 3 views
1

장치에서 실행될 CUDA 코드를 작성 중입니다. 이 코드는 상수 값의 2 개의 조회 테이블을 사용합니다. 이 중 첫 번째는 256 부호없는 int 배열 내가로 선언CUDA에서 dim3 구조체의 상수 배열을 정의하는 방법

__constant__ 
uint16_t edgeTable[256]={ 
    0x000, 
    0x019, 
    ... etc. 
}; 

그리고이 잘 컴파일 것으로 보인다.

두번째 dim3의 고정 된 크기 어레이이고, I는이 시도 :

__constant__ 
dim3 offsets[8] = { 
    {0, 0, 0}, {0, 0, 1}, {0, 1, 0}, 
    ... etc 
}; 

있는 컴파일러 개체. 오류 메시지와 함께 :

error: dynamic initialization is not supported for __device__, __constant__ and __shared__ variables. 

는 아마도 내가 동적 초기화 오해하지만,이 정적 초기화이라고는 컴파일러가 모든 것의 크기를 해결할 수, 나에게 보인다 모든 값이 제공됩니다.

무엇이 여기에 있습니까?

어떻게하면 되겠습니까?

감사

내가 GCC와 우분투 14.04에 CUDA7.5 툴킷을 사용하고 4.8.4

+2

아마도 바보 같은 질문입니다. C++ 11을 사용하도록 플래그를 전달 했습니까? – Hurkyl

+1

매개 변수화 된 생성자 초기화 (dim3은 클래스 임)는 C++에서 C++ 11 이전에 지원되지 않습니다. – talonmies

+0

아마도이 질문은 실제로 동적 초기화 (위의 주석 참조)이며 동적 초기화는 지원되지 않습니다. 이러한 변수 유형은 컴파일러가 지시 한 것과 마찬가지로 C++ 11 컴파일러 스위치와 관계없이 나타냅니다. 가능한 해결 방법으로,'int'의 배열 ('__constant__ int'의 정적 초기화)을 생성 한 다음 커널 코드에서'dim3'의 배열로 캐스팅 할 수 있습니다 (예 : http : // pastebin .com/FrMZxL8T). 아마 당신이 이미 해결 방법을 찾아 낼 수있을 것 같아서, 이것이 대답이라고 제안하는 것은 아닙니다. –

답변

4

이 문제의 중요한 특징은 그 CUDA는 C++ 컴파일 모델을 사용하고, dim3과 같이 처리된다 수업. 그래서 때 : 즉 일정한 메모리 개체의 동적 초기화를 의미하기 때문에

__constant__ dim3 foo = {1,1,1}; 

이 아니며, :

dim3 foo = {1,1,1}; 

이 때문에 매개 변수화 생성자 초기화 지원, C++ 11에서 법적 CUDA 실행 모델은이를 허용하지 않습니다.

상수 메모리 측면이 당신에게 중요하고 dim3의 편의를 원한다면, 당신은 같은 것을 할 수있는 :

#include <cstdio> 

__constant__ int offsets[3*8]; 

__global__ void kernel() 
{ 
    if (threadIdx.x < 8) { 
     dim3 val = *reinterpret_cast<dim3*>(&offsets[3*threadIdx.x]); 
     printf("%d (%d,%d,%d)\n", threadIdx.x, val.x, val.y, val.z); 
    } 
} 

void setup_offsets() 
{ 
    // This requires C++11 support 
    dim3 ovals[8] = { {0,0,0}, 
         {1,0,0}, {0,1,0}, {0,0,1}, 
         {1,1,0}, {1,0,1}, {0,1,1}, 
         {1,1,1} }; 

    cudaMemcpyToSymbol(offsets, &ovals[0], sizeof(ovals)); 
} 

int main(void) 
{ 
    setup_offsets(); 
    kernel<<<1,8>>>(); 
    cudaDeviceSynchronize(); 
    cudaDeviceReset(); 
    return 0; 
} 

조금 해키이지만, 아마 당신은 아래 최선의 희망 할 수 상황. 해당 코드에 대해 PTX를 보면 컴파일러에서 의 각 멤버를 가져 오기 위해 ld.const.u32을 올바르게 방출했습니다.