1024 행렬에 대한 적합도 함수를 실행 중입니다. 각 행렬은 자체 블록을 가지며 같은 크기입니다. 각 블록에는 n*n
개의 스레드 (행렬의 차원)가 있으며 n*n
공유 메모리가 있어야 손쉽게 총계 축소를 수행 할 수 있습니다. 그러나 모든 행렬에 대한 n
차원은 런타임 전에 가변적입니다 (즉, 수동으로 변경할 수 있지만 항상 2의 거듭 제곱이므로 합계는 간단 함). 여기서 공유 메모리는 상수를 사용하여 할당되어야하지만 호스트로부터 커널에 전달할 값이 필요합니다. n
은 커널에 전달하기 위해 CPU에서 볼 수 있도록 (커널 내에서) 공유 메모리의 크기를 선언하는 데 사용할 수 있도록 치수를 어디서 선언해야합니까?CUDA 공유 메모리 할당에 대해 상수 선언 위치
내 코드는 다음과 같이 구성되어있다 : main.cu
에서
내가 커널 전화 : kernel.cu
에 다음
const int num_states = 1024
const int dimension = 4
fitness <<< num_states, dimension * dimension >>> (device_array_of_states, dimension, num_states, device_fitness_return);
과 내가 가진 :
__global__ void fitness(
int *numbers,
int dimension,
int num_states,
int *fitness_return) {
__shared__ int fitness[16]; <<-- needs to be dimension * dimension
//code
}
numbers
1024 행렬을 나타내는 배열입니다 , dimension
은 행 및 열 길이이고, num_states
은 1024입니다. fitness_return
각 행렬의 적합도 값을 보유하는 길이가 1024 인 배열. 커널에서 공유 메모리는 dimension
의 제곱으로 하드 코딩되어 있습니다 (이 경우 dimension
은 4입니다).
어디에서 어떻게 dimension
을 선언하여 공유 메모리를 할당하고 커널을 호출하는 데 사용할 수 있습니까?이 방법으로 한 번에 dimension
만 업데이트하면됩니까? 당신의 도움을 주셔서 감사합니다.
편집 내 대답. – einpoklum
사용하기 전에 전역 범위에서 선언하십시오. –
템플릿 매개 변수는이 경우에 친구가됩니다 – talonmies