2012-08-29 6 views
0

왜 아래 프로그램이 블록 = N, 1,1하지만 1,1, N (결과가 잘못된 값) 또는 1, N, 1 (결과는 0,1,0 ..... 0) 또는 10,50,1 (결과는 0,1,0..0) (N = 500).pycuda 전용 블록 (N, 1,1) 작동

import pycuda.gpuarray as gpuarray 
import pycuda.driver as cuda 
import pycuda.autoinit 
from pycuda.compiler import SourceModule 
import numpy as np 
import random 
from pycuda.curandom import rand 
import cmath 
import pycuda.driver as drv 


N=500 
a_gpu=gpuarray.to_gpu(np.zeros(N).astype(np.int32)) 

mod =SourceModule(""" 
#include <cmath> 

extern "C" {  

__global__ void myfunc(int *a,int N) 
    { 

    int idx=threadIdx.x; //+blockIdx.x*blockDim.x; 

    if (idx<N) 
      a[idx]=idx; 

} 
} 

""",no_extern_c=1) 

#call the function(kernel) 
func = mod.get_function("myfunc") 

func(a_gpu,np.int32(N), block=(N,1,1),grid=(1,1)) 

a=a_gpu.get() 
print("a = ",a) 

-------------- EDIT --------------------------- -------------

좋아요, int idx = threadIdx.y를 사용하면 블록 (1, N, 1)을 사용할 수 있다는 것을 잊어 버렸습니다.

하지만이 배열 블록 (N, 1,1)은 항상 사용해야합니까?

나는 그것을 이해해야합니다! 감사합니다.

+0

블록의 세 번째 차원은 gpu에 따라 64 개의 스레드로 제한되고 블록의 총 스레드 수는 512 또는 1024로 제한됩니다. 당신이 그것을 읽는 것을 걱정한다면 – talonmies

+0

나는 (20 분 전부터) 내 게시물을 편집했습니다 :). 내가 이해할 수없는 것은, 항상 (N, 1,1) 배치를 사용해야 만합니다. 고마워요! – George

답변

1

첫번째 차원은 N threadIdx.x는 0에서 진행 threadIdx.y 상기 제 2 및

는 블록을 실행 threadIdx.z

(N, 1,1)과 제, threadIdx.x에 대응 threadIdx.y 및 threadIdx.z는 항상 0입니다. 당신이 블록 실행하면

(1, N, 1) threadIdx.x는 threadIdx.y 대신

idx = threadIdx.x; 

변경에게 그것을 가지고 너무 N.

0에서

간다, 항상 0이다

idx = blockDim.x * threadIdx.y + threadIdx.x; 

이상의 정밀 (에만 Z로 (X, Y, Z) 블록을 사용하는 경우> 1)

idx = (blockDim.y * threadIdx.z + threadIdx.y) * blockDim.x + threadIdx.x; 
+0

마지막 예제가 올바르게 작동하지 않습니다. idx = threadIdx.x + threadIdx.y * blockDim.x + threadIdx.z * blockDim.x * blockDim.y를 찾았습니다. 괜찮아. 고마워. 이제 어떻게 작동해야하는지 깨달았 어. 이걸로 내가 도울 수 있겠 니? http : //stackoverflow.com/questions/12159709/cuda-out-of-memory-threads-and-blocks-issue – George

+0

@george, 지적 해 주셔서 고맙습니다. blockDd 대신 blockIdx를 사용했습니다. 코드가 수정되었습니다. – ashokk

-2

내가 기억한다면 세 번째 값은 2 또는 3과 같은 작은 숫자로 제한됩니다!

(1, N, 1)을 사용할 수 있어야합니다.

+0

블록의 세 번째 차원은 64로 제한됩니다. – talonmies