다양한 크기 (8 비트, 16 비트, 32 비트, 64 비트)의 정수를 저장하기 위해 전역 메모리의 바이트 버퍼를 사용하는 데 문제가 있습니다.Cuda : 연속적인 다양한 크기의 데이터를 저장하기 위해 전역 메모리 사용
정수를 포인터 값에 4 바이트의 배수가 아닌 정수로 저장하면 (예 : 방금 8 비트 정수가 저장 되었기 때문에) 주소는 반올림되어 이전 데이터가 지워집니다. 임의의 사용 예 코드
__global__ void kernel(char* pointer)
{
*(int*)(pointer+3)=3300000;
}
, 상기 정수는 (포인터)에 저장된다 (포인터) (포인터 + 1), (포인터 + 2), (포인터 + 3)를 고려하여 포인터 인 4의 배수.
하드웨어 수준에서 32 비트 블록으로 구성된 cuda 메모리입니까? 이 작업을 수행 할 수있는 방법이 있습니까?
왜'int' 포인터를 사용하지 않고 * 컴파일러가 최상의 정렬을 결정하도록하지 않습니까? 수백 명의 전문가가 가능한 한 하드웨어와 가장 잘 작동하도록 고안된 기술을 아십니까? –
여러 가지 크기의 데이터를 저장해야하기 때문에 : char, int, long long int 등. 내 프로젝트에서는 int 포인터를 사용하고 char를 저장할 때마다 24 비트의 메모리를 사용할 여유가 없다. (이에 상응하는 코드는 C에서 완벽하게 작동하므로 Cuda 특이성이있는 것 같습니다.) – Ndech
Cuda는 단어 크기 조정이 필요합니다. 그것은 협상 불가능하다. 비 32 비트 정렬 주소를 32 비트 유형으로 변환 할 수 없습니다. – talonmies