왜 아래 프로그램이 블록 = 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)은 항상 사용해야합니까?
나는 그것을 이해해야합니다! 감사합니다.
블록의 세 번째 차원은 gpu에 따라 64 개의 스레드로 제한되고 블록의 총 스레드 수는 512 또는 1024로 제한됩니다. 당신이 그것을 읽는 것을 걱정한다면 – talonmies
나는 (20 분 전부터) 내 게시물을 편집했습니다 :). 내가 이해할 수없는 것은, 항상 (N, 1,1) 배치를 사용해야 만합니다. 고마워요! – George