C++ CUDA:模具代码不工作

C++ CUDA:模具代码不工作,c++,cuda,C++,Cuda,第一:如果这个话题做得不好,我很抱歉(这是我的第一个话题) 我目前正在努力学习NVIDIA上的GPU计算,但是 我对CUDA的_syncthreads()方法有问题,我认为它不起作用。我尝试在网络上搜索,但没有找到修复方法 __global__ void stencil_1d(int *in, int *out) { __shared__ int temp[BLOCK_SIZE + 2 * RADIUS]; // Création de la mémoire partagée ave

第一:如果这个话题做得不好,我很抱歉(这是我的第一个话题) 我目前正在努力学习NVIDIA上的GPU计算,但是 我对CUDA的_syncthreads()方法有问题,我认为它不起作用。我尝试在网络上搜索,但没有找到修复方法

__global__ void stencil_1d(int *in, int *out) {
    __shared__ int temp[BLOCK_SIZE + 2 * RADIUS];   // Création de la mémoire partagée avec tout les threads d'un même block

    int gindex = threadIdx.x + blockIdx.x * blockDim.x;
    int lindex = threadIdx.x + RADIUS;

    /*for (int i = 0; i < N*sizeof(int); i++)
        printf("%i ---i=%i \n", in[i], i);*/

    // Déplacer les éléments d'entrées sur la mémoire partagée
    temp[lindex] = in[gindex];
    if (threadIdx.x < RADIUS) {
        temp[lindex - RADIUS] = in[gindex - RADIUS]; // Récuprère le Halo avant les valeurs du block
        temp[lindex + BLOCK_SIZE] = in[gindex + BLOCK_SIZE]; // Récupère le Halo après les valeurs du block
    }

    __syncthreads(); // Synchronisation des Threads d'un même Block

    int result = 0;
    for (int offset = -RADIUS; offset <= RADIUS ; offset++)
        result += temp[lindex + offset];

    out[gindex] = result;
}
如果忘记了: 定义:

#define N 30
#define THREADS_PER_BLOCK 10
#define BLOCK_SIZE (N/THREADS_PER_BLOCK)
#define RADIUS 3
随机输入代码:

void random_ints(int *var, int n) // Attribue une valeur à toutes le composantes des variables
{
    int i;
    for (i = 0; i < n; i++)
        var[i] = 1;
}
void random_int(int*var,int n)//Attribue une valeurátoutes le composantes des variables
{
int i;
对于(i=0;i
提前感谢您的回答。

最初是为教学而设计的;它有一些缺陷

首先,每当您在使用CUDA代码时遇到问题,我建议您使用
CUDA memcheck
运行代码(请参阅下面我的
CUDA memcheck
使用示例)。如果您在请求他人帮助之前这样做,并在问题中提供错误信息,则可能会帮助他人帮助您

如果您使用
cuda memcheck
运行此代码,它将指示在访问全局内存和共享内存时出现错误

  • 您选择的
    块大小
    不正确。应将其设置为每个块的
    线程数
    ,而不是
    (每个块的N个线程数)
    。看起来您打算用3个块(每个块包含10个线程)运行这个内核,所以我们将使用它

  • 这些行将索引超出范围:

    if (threadIdx.x < RADIUS) {
        temp[lindex - RADIUS] = in[gindex - RADIUS]; // Récuprère le Halo avant les valeurs du block
        temp[lindex + BLOCK_SIZE] = in[gindex + BLOCK_SIZE]; // Récupère le Halo après les valeurs du block
    
    应该是:

    for(int i=0; i<N; i++)
    
    [gindex-RADIUS]:0中(int i=0;i=RADIUS)的
    光环前卫街区酒店
    temp[lindex+BLOCK_SIZE]=((gindex+BLOCK_SIZE)最初是为教学而设计的,它有一些缺陷

    首先,每当您在使用CUDA代码时遇到问题,我建议您使用
    CUDA memcheck
    (请参阅下面我的
    CUDA memcheck
    使用示例)。如果您在向他人寻求帮助之前这样做,并在您的问题中提供错误信息,这可能会帮助他人帮助您

    如果您使用
    cuda memcheck
    运行此代码,它将指示在访问全局内存和共享内存时出现错误

  • 您选择的
    BLOCK\u SIZE
    不正确。应将其设置为
    THREADS\u PER\u BLOCK
    ,而不是
    (N/THREADS\u PER\u BLOCK)
    。您似乎打算使用3个块(每个块包含10个线程)来运行此内核,因此我们将使用它

  • 这些行将索引超出范围:

    if (threadIdx.x < RADIUS) {
        temp[lindex - RADIUS] = in[gindex - RADIUS]; // Récuprère le Halo avant les valeurs du block
        temp[lindex + BLOCK_SIZE] = in[gindex + BLOCK_SIZE]; // Récupère le Halo après les valeurs du block
    
    应该是:

    for(int i=0; i<N; i++)
    
    [gindex-RADIUS]中的(int i=0;i=RADIUS)的
    :0;//Récuprère le Halo avant les valeurs du block
    
    温度[lindex+块大小]=((gindex+块大小)如果你能将评论翻译成英语,阅读起来会更容易…请提供完整的代码,我们想知道
    N
    每个块的线程数
    块大小
    半径
    随机整数
    等是什么。提供一个其他人可以编译的代码,无需添加任何内容。“我对任何库中的任何方法都有问题,我认为它不起作用"-这是初学者常见的误解。通常,您使用的任何库/API都可以正常工作-您当然可以是第一个发现问题的人,但这比您不了解如何正确使用库/API要难得多。错误更可能出现在您的代码/您对库的使用中,而不是库中。这不正确:
    用于(int i=0;iI刚刚更新了帖子,如果您能将评论翻译成英语,那么帖子会更容易阅读…请提供完整的代码,我们想知道
    N
    每个块的线程数
    块大小
    半径
    随机输入数
    等是什么。提供一个其他人可以编译的代码,无需但必须添加任何内容。“我对来自任何库的任何方法都有问题,我认为它不起作用”-这是初学者常见的误解。通常,您使用的任何库/API都可以正常工作-您当然可以是第一个发现问题的人,但这比您不了解如何正确使用库/API要难得多。错误更可能出现在您的代码/您对库的使用中,而不是库中。这不正确:
    for(int i=0;我刚刚更新了postThx,非常感谢您的帮助,我修复了这些东西并使其工作!非常抱歉我的初学者水平。非常感谢您的帮助,我修复了这些东西并使其工作!非常抱歉我的初学者水平。
    
    $ cat t280.cu
    #define N 30
    #define THREADS_PER_BLOCK 10
    #define BLOCK_SIZE THREADS_PER_BLOCK
    #define RADIUS 3
    
    #include <stdio.h>
    
    void random_ints(int *var, int n) // Attribue une valeur à toutes le composantes des variables
    {
        int i;
        for (i = 0; i < n; i++)
            var[i] = 1;
    }
    
    __global__ void stencil_1d(int *in, int *out) {
        __shared__ int temp[BLOCK_SIZE + 2 * RADIUS];   // Création de la mémoire partagée avec tout les threads d'un même block
    
        int gindex = threadIdx.x + blockIdx.x * blockDim.x;
        int lindex = threadIdx.x + RADIUS;
    
        /*for (int i = 0; i < N*sizeof(int); i++)
            printf("%i ---i=%i \n", in[i], i);*/
    
        // Déplacer les éléments d'entrées sur la mémoire partagée
        temp[lindex] = in[gindex];
        if (threadIdx.x < RADIUS) {
            temp[lindex - RADIUS] = (gindex >= RADIUS)?in[gindex - RADIUS]:0; // Récuprère le Halo avant les valeurs du block
            temp[lindex + BLOCK_SIZE] = ((gindex + BLOCK_SIZE)<N)?in[gindex + BLOCK_SIZE]:0; // Récupère le Halo après les valeurs du block
        }
    
        __syncthreads(); // Synchronisation des Threads d'un même Block
    
        int result = 0;
        for (int offset = -RADIUS; offset <= RADIUS ; offset++)
            result += temp[lindex + offset];
    
        out[gindex] = result;
    }
    
    int main()
    {
        int size = N * sizeof(int);
    
        /******************** Utilisation de la fonction GPU stencil_1d ********************/
    
        int *in, *out; // Variable sur la mémoire Host
        int *d_in, *d_out;  //Variable sur la mémoire Device
    
        // Allocation de la mémore aux variables sur le Device
        cudaMalloc((void**)&d_in, size);
        cudaMalloc((void**)&d_out, size);
    
        // Allocation de la mémoire aux variables de Host
        in = (int*)malloc(size); random_ints(in, N);
        out = (int*)malloc(size);
    
        // Copie des valeurs des variables de Host vers Device
        cudaMemcpy(d_in, in, size, cudaMemcpyHostToDevice);
        cudaMemcpy(d_out, out, size, cudaMemcpyHostToDevice);
    
        // Exécution de la fonction sur le Device (ici 3 Blocks, 10 Threads)
        stencil_1d <<<N/THREADS_PER_BLOCK, THREADS_PER_BLOCK>>>(d_in, d_out);
    
        // Récupération de la variable out de Device vers Host
        cudaMemcpy(out, d_out, size, cudaMemcpyDeviceToHost);
    
        // Affichage du résultat
        for(int i=0; i<N; i++)
            printf("%i ---i=%i \n", out[i], i);
    
        // Libération de la mémoire prise par les variables sur Host
        free(in); free(out);
    
        // Libération de la mémoire prise par les variables sur le Device
        cudaFree(d_in); cudaFree(d_out);
    
        return 0;
    }
    $ nvcc -o t280 t280.cu
    $ cuda-memcheck ./t280
    ========= CUDA-MEMCHECK
    4 ---i=0
    5 ---i=1
    6 ---i=2
    7 ---i=3
    7 ---i=4
    7 ---i=5
    7 ---i=6
    7 ---i=7
    7 ---i=8
    7 ---i=9
    7 ---i=10
    7 ---i=11
    7 ---i=12
    7 ---i=13
    7 ---i=14
    7 ---i=15
    7 ---i=16
    7 ---i=17
    7 ---i=18
    7 ---i=19
    7 ---i=20
    7 ---i=21
    7 ---i=22
    7 ---i=23
    7 ---i=24
    7 ---i=25
    7 ---i=26
    6 ---i=27
    5 ---i=28
    4 ---i=29
    ========= ERROR SUMMARY: 0 errors
    $