我正在尝试初始化设备上的某些结构,但是当它们回来时,它们都很杂乱。 我知道我使用指针的方式有问题,但是我似乎无法弄清楚。

这是我在主机上的内存分配

body* devBodies;
body** devBodyList;
float* devRandoms;
cudaMalloc((void**)&devBodies, n * sizeof(body));
cudaMalloc((void**)&devBodyList, n * sizeof(body*));
cudaMalloc((void**)&devRandoms, n * 3 * sizeof(float));

这是我的函数调用,这里devRandoms只是浮点列表。

CUDAInitBodies<<<n,1>>>(devBodyList, devBodies, devRandoms);

这是我的方法:

__global__ void CUDAInitBodies(body** devBodyList, body* devBody, float* rand)
{
    int j;
    int tid = blockIdx.x;
    *(devBodyList[tid]) = devBody[tid];
    devBodyList[tid]->id = tid;
    devBodyList[tid]->m = 10;
    for(j = 0; j < 3; j++) 
    {
        devBodyList[tid]->a[j] = 0;
        devBodyList[tid]->v[j] = 0;
        devBodyList[tid]->pos[j] = rand[(tid * 3) + j];
    }   

}

然后将数据复制回主机时:

body* bodies = (body*)malloc(n * sizeof(body));
cudaMemcpy(bodies, devBodies, n * sizeof(body), cudaMemcpyDeviceToHost);

当我打印出“ body”的变量时,得到以下信息:

====BODY[-581043205]====
    M = -42522218781525353518415985938704367616.000000
    V = [-311601248975690312470654313562112.000000, 17269896096570671104.000000, 307939529506715418513587721849804947456.000000]
    X = -19247336126697914498972549714433540096.000000
    Y = 17731266573644159438123340575306416128.000000
    Z = -544771403677696.000000

我已经尝试了很多种方式,但是似乎没有任何办法

===============>>#1 票数:1 已采纳

之所以得到垃圾输出,是因为您在内核中的这一行代码中取消引用了未初始化的指针:

*(devBodyList[tid]) = devBody[tid];

在主机上,您在此处为指针数组分配了存储空间:

cudaMalloc((void**)&devBodyList, n * sizeof(body*));

这样只会为指针数组创建存储。 它不会将数组中的任何指针设置为指向任何有效的指针。

数组的每个成员都是指向 body结构的指针 ,以第一个成员为例:

devBodyList[0]

但是该指针不会指向任何内容(有效),除非您使用诸如(在设备代码中)的语句对其进行初始化:

devBodyList[0] = &(devBody[0]);

现在,我可以将devBodyList[0]用作指向devBody[0]处分配的主体结构的指针。 注意devBodyList[0]存储在设备上 ,因此要初始化它,我必须:

  1. 在使用之前(例如上面的代码行),请先在设备代码中对其进行初始化。
  2. 在主机上对其进行初始化,但是设置一个有效的指针,然后使用诸如cudaMemcpy类的操作将该初始化值复制到已分配的设备存储中。

除非您考虑了上述情况,否则当您使用指针时,它将包含一个垃圾值,而取消引用它会产生无效的访问。 通过使用cuda-memcheck运行代码,您可以查看这些无效访问的证据。 您将收到诸如“无效的全局写入...”之类的消息。

这是一个完全有效的代码,基于您的代码,不会产生垃圾结果。 (我并不是说这特别明智,因为使用devBodyList[x]引用devBody[x]对我来说似乎是不必要的。)但这是合法代码,不会产生任何内核错误:

#include <stdio.h>

struct body {
int id;
int m;
int a[3];
int v[3];
float pos[3];
};

__global__ void CUDAInitBodies(body** devBodyList, body* devBody, float* rand)
{
    int j;
    int tid = blockIdx.x;
    devBodyList[tid] = &(devBody[tid]);
    *(devBodyList[tid]) = devBody[tid];
    devBodyList[tid]->id = tid;
    devBodyList[tid]->m = 10;
    for(j = 0; j < 3; j++)
    {
        devBodyList[tid]->a[j] = 0;
        devBodyList[tid]->v[j] = 0;
        devBodyList[tid]->pos[j] = rand[(tid * 3) + j];
    }

}

int main(){
  int n = 1;
  body *devBodies;
  body **devBodyList;
  float *devRandoms;

  cudaMalloc((void**)&devBodies, n * sizeof(body));
  cudaMalloc((void**)&devBodyList, n * sizeof(body*));
  cudaMalloc((void**)&devRandoms, n * 3 * sizeof(float));

  CUDAInitBodies<<<n,1>>>(devBodyList, devBodies, devRandoms);

  body* bodies = (body*)malloc(n * sizeof(body));
  cudaMemcpy(bodies, devBodies, n * sizeof(body), cudaMemcpyDeviceToHost);

  printf("Body %d\n", bodies[0].id);
  printf("M : %d\n", bodies[0].m);
  printf("V : %d\n", bodies[0].v[0]);
  return 0;
}

  ask by Chris Phillips translate from so

未解决问题?本站智能推荐:

1回复

将指针传递给三个嵌套函数

我正在研究一个CUDA项目。 但是,这基本上是指针上的C概念,与CUDA本身没什么关系。 我不确定我的引用/解除引用指针是否正确完成以反映我的kernel函数的新值(与C函数相同,但在GPU上完成)。 我的kernel获取一个指针作为参数: foo1问题:我应该在调用foo
1回复

将cuda设备指针传递给主机函数

我正在开发一个程序。 我是CUDA和C的新手,所以对我来说确实是一个坎bump的旅程。 我正在尝试将结构复制到设备中。 然后,我尝试通过将结构复制到设备来使结构返回到主机。 下面是代码: 和copyMatrix的定义: 该错误表明,第一次对cudaMemcpy的调用在0x
1回复

CUDA指针,调用内核[关闭]

如果我在C函数中使用指针,例如: 执行内核时应如何调用?
2回复

使用CUDA内核获得堆栈溢出

我编程的代码存在很大问题。 我不是专家,在来到这里之前我问了很多人。 也纠正了很多事情。 所以,我想我已准备好向您展示代码并向您提问我的问题。 我会把整个代码放在这里,以便让你很好地理解我的问题。 我想做的事情是,如果ARRAY_SIZE对于ARRAY_SIZE来说太大了,那么我将大数
1回复

传递带有指向CUDA设备内存的指针的表init

在这个简短的示例中,我试图通过一个带有带有cuda设备内存中的指针的struct init的表。 复制到主机- >设备,设备- >主机似乎工作,但在`_ 全球 _ function nothing works. Values for function nothing works.
1回复

将指向设备__constant__内存的指针传递给内核,而不是直接使用

我在ubuntu 12.10和gcc 4.6上使用CUDA 5.0和GTX 670,并且编写了一个名为Grid的类: https://github.com/benadler/octocopter/blob/master/basestation/grid.cu https://gith
2回复

静态矩阵传递给cudaMemCpyToSymbol

我想将常量内存与静态分配的矩阵一起使用。 我声明常数矩阵如下: 在main()函数中,有一个静态分配的矩阵,如下所示: 而且我必须将h_M矩阵传递给以下函数: 定义于: cudaMemCpyToSymbol 我该怎么做呢? 考虑到我必须用特定的值初始化矩阵,所以
2回复

将基于指针的结构传递给cuda

我有使用指向struct的指针的C代码。 我试图弄清楚如何将其传递给CUDA,但运气不佳。 我有 然后 在我的代码中,我遍历了所有这些内容,并且试图找出如何将它们传递给内核,以便可以执行以下操作: 但我不知道如何通过。 有任何想法吗?
2回复

结构中的指针传递给CUDA

我现在已经搞砸了一段时间,但似乎无法做到这一点。 我正在尝试将包含数组的对象复制到CUDA设备内存中(然后又回来了,但是当我来到它时我会越过那个桥): 当我调用MyFunc(d_items)时,我可以正常访问数据[idx] .dataLen。 但是,data [idx] .data尚
1回复

将结构中的双指针传递给CUDA

我有以下结构: 我想在CUDA中对“ K_RP”执行以下操作 如果“ prop”具有以下格式,我应该如何执行“ cudaMalloc”和“ cudaMemcpy”操作?