私はJavaで次のコードを持っています:
float in[][] = new float[2][2];
float B[] = new float[2];
float A[] = new float[2];
float res[] = new float[A[0].length];
for(float r : res){
r = 0;
}
for (int i = 0; i < A[0].length; i++) {
for (int j = 0; j < B[0].length; j++) {
res[i] += A[j] * in[j][i];
}
せいぜい単純化しただけなので、実際のロジックを検索しないでください:)。
ループ内の += ステートメントのため、CUDA でこれを変換するのに数時間苦労しました。
私はこのようなものから始めました:
extern "C"
__global__ void filter(float* in, float* A, float* B, float* res, int in_size){
unsigned int x = blockIdx.x*blockDim.x + threadIdx.x;
unsigned int y = blockIdx.y*blockDim.y + threadIdx.y;
res[x] = A[y] * in[x + y * in_width];
}
しかし、すべてのスレッドが同じ変数を設定しようとしているために機能しないことにすぐに気付きました。
このプレゼンテーションで内積の例を読みましたが、in の 2 次元の必要性にそれを適応させる方法がよくわかりません。
私は完全な解決策を求めているわけではありませんが、どんな方向性も間違いなく歓迎されます.
どうも、