【问题标题】:Simple CUDA kernel not returning values as expected简单的 CUDA 内核未按预期返回值
【发布时间】:2014-04-23 13:27:59
【问题描述】:

因此,我开始对 CUDA 感到非常沮丧,以至于我决定编写我能写的最简单的代码,只是为了了解我的方向。但似乎有什么事情发生在我的头上。在我的代码中,我只是添加了两个数组,然后将它们存储在第三个数组中,如下所示:

#include <stdio.h>
#include <stdlib.h>

__global__ void add(int* these, int* those, int* answers)
{
    int tid = blockIdx.x;
    answers[tid] = these[tid] + those[tid];
}

int main()
{
    int these[50];
    int those[50];
    int answers[50];

    int *devthese;
    int *devthose;
    int *devanswers;

    cudaMalloc((void**)&devthese, 50 * sizeof(int));
    cudaMalloc((void**)&devthose, 50 * sizeof(int));
    cudaMalloc((void**)&devanswers, 50 * sizeof(int));


    int i;
    for(i = 0; i < 50; i++)
    {
        these[i] = i;
        those[i] = 2 * i;
    }

    cudaMemcpy(devthese, these, 50 * sizeof(int), cudaMemcpyHostToDevice);
    cudaMemcpy(devthose, those, 50 * sizeof(int), cudaMemcpyHostToDevice);
    add<<<50,1>>>(devthese, devthose, devanswers);

    cudaMemcpy(answers, devanswers, 50 * sizeof(int), cudaMemcpyDeviceToHost);
    for(i = 0; i < 50; i++)
    {
        fprintf(stderr,"%i\n",answers[i]);
    }
    return 0;
}

但是,正在打印的 int 值不遵循 3 的倍数序列,这正是我所期望的。谁能解释一下出了什么问题?

【问题讨论】:

  • 我建议使用正确的 CUDA 错误检查。
  • stackoverflow.com/q/14038589/681865 展示了如何检查运行时错误。代码中的每个 API 调用都会返回一个状态。你应该把它们都检查一遍。
  • 您的代码对我来说很好用。如果你没有得到 0,3,6,9... 那是因为你使用的机器有问题。我将添加已建议的错误检查。您得到的错误将是您机器出现问题的一个很好的初步迹象。这可能很简单,比如您针对所使用的 GPU 类型运行了不正确的编译命令。
  • 另外,请编辑您的问题,给它一个有意义的标题。 Stack Overflow 问题不仅是为了您的利益,而且旨在对追随您的其他人有用。您的标题使搜索变得不可能
  • @ChrisPhillips:现在已修复。请发布您的解决方案作为答案(稍后再回来接受)。这样就可以将其从未回答的问题列表中删除。

标签: c cuda


【解决方案1】:

从 cmets 来看,问题显然与编译期间使用了不正确的目标架构有关,导致可执行文件无法在 OP 的 GPU 上运行。

已添加此社区 Wiki 答案,以将其从未答复队列中删除。如果/当 OP 回来并提供更完整的答案时,它可以被删除。

【讨论】:

    猜你喜欢
    • 2020-07-06
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2014-03-14
    • 2012-10-05
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多