2012-03-10 4 views
1

다양한 크기 (8 비트, 16 비트, 32 비트, 64 비트)의 정수를 저장하기 위해 전역 메모리의 바이트 버퍼를 사용하는 데 문제가 있습니다.Cuda : 연속적인 다양한 크기의 데이터를 저장하기 위해 전역 메모리 사용

정수를 포인터 값에 4 바이트의 배수가 아닌 정수로 저장하면 (예 : 방금 8 비트 정수가 저장 되었기 때문에) 주소는 반올림되어 이전 데이터가 지워집니다. 임의의 사용 예 코드

__global__ void kernel(char* pointer) 
{ 
    *(int*)(pointer+3)=3300000; 
} 

, 상기 정수는 (포인터)에 저장된다 (포인터) (포인터 + 1), (포인터 + 2), (포인터 + 3)를 고려하여 포인터 인 4의 배수.

하드웨어 수준에서 32 비트 블록으로 구성된 cuda 메모리입니까? 이 작업을 수행 할 수있는 방법이 있습니까?

+2

왜'int' 포인터를 사용하지 않고 * 컴파일러가 최상의 정렬을 결정하도록하지 않습니까? 수백 명의 전문가가 가능한 한 하드웨어와 가장 잘 작동하도록 고안된 기술을 아십니까? –

+0

여러 가지 크기의 데이터를 저장해야하기 때문에 : char, int, long long int 등. 내 프로젝트에서는 int 포인터를 사용하고 char를 저장할 때마다 24 비트의 메모리를 사용할 여유가 없다. (이에 상응하는 코드는 C에서 완벽하게 작동하므로 Cuda 특이성이있는 것 같습니다.) – Ndech

+1

Cuda는 단어 크기 조정이 필요합니다. 그것은 협상 불가능하다. 비 32 비트 정렬 주소를 32 비트 유형으로 변환 할 수 없습니다. – talonmies

답변

1

단어 크기 정렬은 CUDA에서 협상 할 수 없습니다. 그러나 어떤 이유에서든 성능에 치중 할 의향이 있다면 char *로 데이터를 압축 한 다음 사용자 정의 저장 기능을 작성할 수 있습니다.

__inline __device__ void Assign(int val, char * arr, int len) 
{ 
    for (int idx = 0; idx < len; idx++) 
     *(arr+idx)=(val & (0xFF<<(idx<<8)) 
} 

__inline __device__ int Get(char * arr, int idx, int len) 
{ 
    int val; 
    for (int idx = 0; idx < len; idx++) 
     val=(int)(*arr[idx+len*idx]<<(idx<<8))); 
    return val; 
} 

희망 하시겠습니까?

+0

감사합니다. 도움이됩니다. 내 응용 프로그램의 성능과 메모리 사용 최적화 사이의 최적의 균형을 찾기 위해 솔루션을 시도 할 것입니다. – Ndech

관련 문제