嵌套for循环,带+ =赋值

时间:2012-09-25 13:38:59

标签: cuda jcuda

我在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 this presentation的例子, 但我真的没有看到如何适应我需要的两个维度。

我不是要求一个完整的解决方案,但任何方向肯定会受到赞赏。

谢谢,

2 个答案:

答案 0 :(得分:1)

太多的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];
    }

}

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

答案 1 :(得分:0)

你可以在A [0] .length * B [0] .length线程中将[j] [i]中的乘法作业A [j] *分开,并且可以将乘法的结果相加,就像减少样本一样NVIDIA sdk使用共享内存