嵌套的 for 循环,具有 += 赋值



我在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 的二维需求。

我不要求完整的解决方案,但任何方向肯定会不胜感激。

感谢

太多的 CUDA 杀死了我的头。

我通过展开内核中的一个循环找到了部分解决方案。这是它现在的样子:

extern "C"
__global__ void filter(float* in, float* A, float* res, const int in_width, const int sizeB){
    unsigned int x = blockIdx.x*blockDim.x + threadIdx.x;
    int i = 0;
    for(i = 0; i < sizeB; i++){
        res[x] += A[i] * in[i + x * in_width];
    }
}

我相信我能找到更好的,但我想我会坚持今天:)

您可以在 A[0].length*B[0].length 线程中拆分乘法作业 A[j] * in[j][i],并且可以将乘法结果汇总为使用共享内存的 NVIDIA SDK 中的缩减示例

相关内容

  • 没有找到相关文章

最新更新