2014-02-12 1 views
0

CUDA GPU 2D 매트릭스를 정의하고 액세스하는 간단한 방법이 있습니까?CUDA GPU 2D 매트릭스 액세스

같은 것 M[i][j].

이미 일부 라이브러리가 있습니까?

+1

이 질문에 대한 @talonmies의 대답 중 두 번째 부분을보십시오 : [어떻게 두 개의 2d (피치) 배열을 사용하여 중첩 된 루프?] (http://stackoverflow.com/questions/6137218/how-can-i-add-up-two-2d-pitched-arrays-using-nested-for-loops). – JackOLantern

+1

#define] [* width + ===> M [i] [j]는 백그라운드에서 M [i * width + j]가 될 수 있습니까? –

답변

1

보통 CUDA에서, 당신은 선형 메모리에 배열을 변환해야합니다 당신은 M을 사용하여 주장하는 경우
(2 차원 배열의 경우, 그들은 선형 메모리 cudaMallocPitch를 사용하여 변환해야합니다) [I] [J] 표기법을 사용하면 장치의 배열을 "배열 배열"로 할당 할 수 있습니다. 이 경우 cudaMalloc을 사용하여 배열의 각 행을 할당 한 다음 포인터 배열의 각 행에 포인터를 저장합니다. 그런 다음이 포인터 배열을 장치에 할당해야합니다!

따라서 M [i]라고 말하면 i 번째 행에 대한 포인터가 주어지며 해당 포인터의 [j] 색인을 사용할 수 있습니다.

지난 3 주 동안이 물건을 몹시 들여다 보던 사람 (일명 나!)이 할 수있는 최악의 상황입니다. 할당은 전역 메모리에 흩어져 있으며 대부분 CUDA 정렬 요구 사항을 충족시키지 못합니다. 따라서 액세스가 완전히 통합되지 않으며 액세스 지연으로 인해 커널 성능이 저하됩니다. 최고의 성능을 위해 선형 메모리와 피치 메모리에 충실하십시오. 색인 생성 규칙은 처음에는 조금 혼란스럽고 어색하지만 익숙해 질 것입니다 :-)