Cuda 嵌套for循环,带+;=转让

Cuda 嵌套for循环,带+;=转让,cuda,jcuda,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].len

我有以下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];
}
但很快意识到它无法工作,因为所有线程都试图设置相同的变量

我读了点积的例子, 但我真的不知道如何适应我的需要,在两个方面的

我不要求一个完整的解决方案,但任何方向都会被感激


Thx,

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

}
extern“C”
__全局无效过滤器(浮点*in,浮点*A,浮点*res,常量int in_width,常量int sizeB){
无符号整数x=blockIdx.x*blockDim.x+threadIdx.x;
int i=0;
对于(i=0;i

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

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

}
extern“C”
__全局无效过滤器(浮点*in,浮点*A,浮点*res,常量int in_width,常量int sizeB){
无符号整数x=blockIdx.x*blockDim.x+threadIdx.x;
int i=0;
对于(i=0;i

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

您可以将[j][I]中的乘法作业A[j]*拆分为[0]。长度*B[0]。长度线程,并可以使用共享内存将乘法结果汇总为NVIDIA sdk中的缩减样本。

您可以将[j][I]中的乘法作业A[j]*拆分为[0].length*B[0]。使用共享内存,可以将乘法结果相加,就像NVIDIA sdk中使用的缩减示例一样

您仍然在使用所有线程递增res,这也不应该起作用。如果只是浮动,你可以使用原子(虽然速度应该很慢),或者你可以对每个块进行适当的二叉树缩减,然后在cpu上对块和求和。它确实有效。我正在为同一线程增加循环中的一个元素。在这种情况下,每个x对应一个线程,所以循环是安全的。缺点是每个线程都必须执行一个循环,所以我只对进程进行了一半优化。这看起来就像我第一次将其并行化一样。您需要将res数组初始化为零,我假设您在这个内核之外执行此操作。将res[x]=0会更快;在内核内部的循环之前。接下来是优化…thx反馈。很高兴知道其他人也会这么做:)你仍然在用所有线程增加res,这也不应该起作用。如果只是浮动,你可以使用原子(虽然速度应该很慢),或者你可以对每个块进行适当的二叉树缩减,然后在cpu上对块和求和。它确实有效。我正在为同一线程增加循环中的一个元素。在这种情况下,每个x对应一个线程,所以循环是安全的。缺点是每个线程都必须执行一个循环,所以我只对进程进行了一半优化。这看起来就像我第一次将其并行化一样。您需要将res数组初始化为零,我假设您在这个内核之外执行此操作。将res[x]=0会更快;在内核内部的循环之前。接下来是优化…thx反馈。很高兴知道其他人也会这么做:)那么我需要一个sizeA*sizeB数组。可能是个问题,因为我在一个巨大的表中工作,所以我需要一个sizeA*sizeB数组。可能是个问题,因为我在大桌子上工作