2016-08-06 3 views
0

n-by-m 행렬이 주어지면 각 행 행의 최소값을 포함하는 n 크기의 벡터를 CUDA로 작성하고 싶습니다.CUDA에서 최소 배열 행

지금까지 나는이를 통해 왔어요 :

__global__ void OnMin(float * Mins, const float * Matrix, const int n, const int m) { 
    int i = threadIdx.x + blockDim.x * blockIdx.x; 
    if (i < n) { 
     Mins[i] = Matrix[m * i]; 
     for (int j = 1; j < m; ++j){ 
      if (Matrix[m * i + j] < Mins[i]) 
       Mins[i] = Matrix[m * i + j]; 
     } 
    } 
} 

이라고 불리는 :

OnMin<<<(n + TPB - 1)/TPB, TPB>>>(Mins, Matrix, n, m); 

좀 더 최적화 된 무언가가 존재할 수 있다고 생각하지만.

루프에서 cublasIsamin을 호출하려했지만 속도가 느립니다.

가 나는 또한 성공하지 ... OnMin 커널에서 커널 (글로벌)를 시작하려고

어떤 아이디어 (sm_35을 compute_35 컴파일 에러를 발생합니다 ... 나는 GTX670이)?

감사합니다.

+1

어쩌면 당신의 매트릭스를 먼저 transposing하여 그것을 개선 할 수 있습니다 (나는 기본적으로 수학이 없기 때문에 메모리가 바운드 된 것 같습니다). 문제는 메모리 액세스 패턴이 합쳐지지 않는다는 것입니다 (지정된 워프의 스레드는 연속적인 메모리 항목을 읽습니다. 메모리에 연속적으로 나타나지는 않습니다). 또한, 당신은 nvvp의 결과를 보았습니까? – leo

+1

[CUDA로 행렬 줄이기] 가능한 중복 (http://stackoverflow.com/questions/17862078/reduce-matrix-rows-with-cuda) –

답변

1

행 - 주요 행렬에서 배열 행의 최소값을 찾는 것은 스택 오버 플로우에서 여러 번 논의 된 병렬 감소 문제입니다. 예를 들어,이 하나.

Reduce matrix rows with CUDA

기본적인 아이디어는 그리드에 n 블록을 사용하는 것입니다. 각 블록은 고정 된 수의 스레드 (일반적으로 256)를 포함합니다. 각 스레드 블록은 m 요소의 행에 대해 병렬 감소를 수행하여 협업으로 최소값을 찾습니다.

GPU를 최대한 활용할 수있는 충분히 큰 매트릭스의 경우 성능 상한은 매트릭스를 한 번 복사하는 시간의 절반입니다.