2013-01-22 4 views
8

장치 포인터의 용도와 cudaArray 구조의 차이점에 대해 혼란스러워합니다. 누군가 내가 왜 다른 것을 사용하는지 설명해 주시겠습니까? 내 기본적인 문제는 문서를보고 "CUDA by Example"이라는 책을 읽은 후 API 디자이너의 의도를 이해하지 못한다는 것입니다.cudaArray 대 장치 포인터

필자가 본 것으로부터 cudaArray은 텍스처에 사용되고 포인터는 메모리에 직접 액세스해야합니다. 또한 3D 텍스처는 cudaArray을 사용해야 만 만들 수 있습니다. 모든 텍스처는 cudaArray을 사용하여 할당해야합니까? 수많은 예제가없는 것처럼 보입니다. 또한 함수가 cudaMallocArraycudaMallocArray3D 인 이유는 무엇입니까? cudaMallocArray2D과 동일하지 않은 이유는 무엇입니까? 반대로 cudaBindTexturecudaBindTexture2D이 있지만 cudaBindTexture3D은 없습니까?

답변

16

cudaArray은 텍스처 바인딩에 최적화 된 불투명 한 메모리 블록입니다. 텍스처는 space filling curve에 저장된 메모리를 사용할 수 있으므로 더 나은 2D 공간 지역성으로 인해 텍스처 캐시 적중률이 향상됩니다. cudaArray에 데이터를 복사하면 해당 곡선으로 형식이 지정됩니다.

따라서 데이터를 cudaArray에 저장하는 것이 더 나은 텍스처 캐시 적중률을 낼 수있는 최적화 기술입니다. 초기 CUDA 아키텍처에서는 커널이 cudaArray에 액세스 할 수 없습니다. 그러나 컴퓨팅 기능이 2.0 이상인 아키텍처는 CUDA 표면을 통해 어레이에 액세스 할 수 있습니다.

cudaArray 또는 일반 버퍼를 전역 메모리에 사용해야하는지 결정하는 것은 메모리의 용도와 액세스 패턴에 따라 다릅니다. 프로젝트마다 다릅니다.

cudaMallocArray() 실제로 2 차원 배열을 할당하므로 문제는 단지 일관성없는 이름 지정이라고 생각합니다. 어쩌면 cudaMallocArray2D()이라고하는 것이 더 합리적이었을 것입니다.

3D 텍스처를 사용하지 않았습니다. 바라건대, 누군가 대답을하고 왜 cudaBindTexture3D()이 필요하지 않은지 알려주세요.

1

cudaBindTextureToArray를 사용할 수 있으며 2D 및 3D 모두에서 작동합니다.