【问题标题】:Update Array values in each iteration在每次迭代中更新数组值
【发布时间】:2019-11-29 09:42:18
【问题描述】:

我是 CUDA C 编码的新手,我的问题是我需要在每次迭代中更新数组的值;

这是我的代码的一部分,这段代码中使用的函数可以是任何东西,我只需要知道如何在每次迭代中对 Old_Array 的新元素进行操作: (旧数组包含来自主机的元素)

__global__ void MyKernel(int *Old_Array, int *new_Array)
{
    int tid = blockIdx.x *  blockDim.x + threadIdx.x;
    int *p1, *p2;
    int Part1[Nbr], Part2[Nbr];

    if (tid < (Nbr / 2)) {

        //split Old_Array
        for (int i = 0; i < NbrCities; i++) {
            Part1[i] = Old_Array[tid * 2 * NbrCities + i];
            Part2[i] = Old_Array[tid * 2 * NbrCities + NbrCities + i];
        }

        p1 = operation(Part1, Part2);
        p2 = operation2(Part1, Part2);

        //replace  the new elements in the narray
        for (int i = 0; i < Nbr; i++) {
            Old_Array[tid * 2 * Nbr + i] = p1[i];
            Old_Array[tid * 2 * Nbr + NbrCities + i] = p2[i];
        }

        //display values of new_Array         
        if (tid == 0)
            CustumPrint(new_Array, Old_Array);
    }
}

这是内存分配和复制后的内核调用:

for (int j = 0; j < 4; j++) {
    MyKernel << <blocksPerGrid, threadsPerBlock >> > (d_array);
    cudaDeviceSynchronize();
}

【问题讨论】:

  • 您问题中的内核调用只有一个参数。宿主代码中没有新旧数组

标签: cuda


【解决方案1】:

这种执行方式:

for(int j=0;j<4;j++){   
    MyKernel<<<blocksPerGrid, threadsPerBlock>>>(d_array);              
    cudaDeviceSynchronize();   
}

应该基本上可以工作。事实上你甚至不需要使用 cudaDeviceSynchronize();因为您使用的是默认流;每个内核启动都只是排队并按顺序执行。所以你可以这样写:

for(int j=0;j<4;j++){   
    MyKernel<<<blocksPerGrid, threadsPerBlock>>>(d_array);              
}
cudaDeviceSynchronize();   

为了同样的效果,d_array 的内容将在 4 次内核启动时更新 4 次。

从那里开始,只需定义内核以执行您希望它执行的任何特定操作。所以这会起作用:

__global__ void MyKernel(int *d_array) {
    int tid =  blockIdx.x * blockDim.x + threadIdx.x;
    d_array[tid] *= 2;
}

在 4 次迭代中启动此内核应该将所有数组的内容乘以 2^4。因此,如果您有一些依赖于重复内核执行的迭代算法,这肯定是一种方法。

【讨论】:

    猜你喜欢
    • 2018-02-21
    • 2021-05-08
    • 2018-11-26
    • 2023-04-03
    • 2022-01-10
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    相关资源
    最近更新 更多