【发布时间】: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:现在已修复。请发布您的解决方案作为答案(稍后再回来接受)。这样就可以将其从未回答的问题列表中删除。