2つの行列Nx3とMx3を取得し、行列NxMを返すPyCUDA関数を作成する必要がありますが、列の数がわからないと、参照によって行列を渡す方法がわかりません。
私のコードは基本的に次のようなものです。
#kernel declaration
mod = SourceModule("""
__global__ void distance(int N, int M, float d1[][3], float d2[][3], float res[][M])
{
int i = threadIdx.x;
int j = threadIdx.y;
float x, y, z;
x = d2[j][0]-d1[i][0];
y = d2[j][1]-d1[i][1];
z = d2[j][2]-d1[i][2];
res[i][j] = x*x + y*y + z*z;
}
""")
#load data
data1 = numpy.loadtxt("data1.txt").astype(numpy.float32) # Nx3 matrix
data2 = numpy.loadtxt("data2.txt").astype(numpy.float32) # Mx3 matrix
N=data1.shape[0]
M=data2.shape[0]
res = numpy.zeros([N,M]).astype(numpy.float32) # NxM matrix
#invoke kernel
dist_gpu = mod.get_function("distance")
dist_gpu(cuda.In(numpy.int32(N)), cuda.In(numpy.int32(M)), cuda.In(data1), cuda.In(data2), cuda.Out(res), block=(N,M,1))
#save data
numpy.savetxt("results.txt", res)
これをコンパイルすると、エラーが発生します。
kernel.cu(3): error: a parameter is not allowed
つまり、関数の宣言でres[][]の列数としてMを使用することはできません。列数を宣言しないままにすることもできません...
出力として行列NxMが必要ですが、これを行う方法がわかりません。手伝って頂けますか?