我在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 的二维需求进行调整。
我不要求一个完整的解决方案,但任何方向肯定会受到赞赏。
谢谢,