c - 将指针向下传递给三个嵌套函数

标签 c pointers cuda

我正在从事 CUDA 项目。但是,这基本上是一个关于指针的 C 概念,与 CUDA 本身没有太大关系。

我不确定我的引用/取消引用指针是否正确完成以反射(reflect)我的内核函数的新值(与 C 函数相同,但在 GPU 上完成)。

我的 kernel 得到一个指针作为参数:

__global__ kernel(StructA *a)
{
  StructB b;
  foo1(&a, &b); // passing both addresses to foo1
                // I don't need to modify anything on StructA, might in future
                // But, I will assign values to StructB (in foo1 and foo2)
  ...
  // Work with StructB
  ...
}

关于 foo1 的问题:我是否应该在调用 foo2 时给出指向指针 StructA 的指针的地址?

__device__ foo1(StructA **a, StructB *b) // pointer-to pointer and pointer
{
  int tid = blockIdx.x * blockDim.x + threadIdx.x;
  if( (*a)->elem1[tid] ) // Access to value in elem1[tid]
    foo2(a, &b, tid);    // Pass structures to foo2
  ...
  b->elem3 = 1;          // Assign value to StructB
  ...
}

foo2 的问题:如果我传递 StructA 地址,我将需要 StructA 的第三级指针。但是,我迷失在那个级别的指针上。

__device__ foo2(StructA **a, StructB **b, int tid)
{
  // Assign value from elem2 in StructA for the thread to elem2 in StructB
  (*b)->elem2 = (*a)->elem2[tid]; // Assign value to StructB from StructA

  // HELP in previous line, not so sure if referencing the in the Structures
  // are done correctly.
  ...
}

我可以粘贴我的实际代码,但不想让事情复杂化。

最佳答案

这应该是你需要的。

 foo1(a, &b);

__device__ foo1(StructA *a, StructB *b)

   foo2(a, b, tid); //when we are inside foo1, foo1 has the pointers available 
    //so we just pass it to foo2.

__device__ foo2(StructA *a, StructB *b, int tid)

如果您在 foo1 中执行 foo2(a, &b, tid);,您将传递包含指向结构的指针的指针变量的地址,但这不是必需的,只要因为你有指向函数中可用结构的指针,你可以通过简单地说将它传递给其他函数

`function_name(structA *pointer_to_strucutA)

关于作业,你所做的是正确的,但不是必需的

(*b)->elem2 = (*a)->elem2[tid]; //this is correct if you pass a pointer to pointer to struct 

如果你遵循我的代码,你真正需要的是

b->elem2 = a->elem2[tid];

关于c - 将指针向下传递给三个嵌套函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22056572/

相关文章:

c++ - 为什么要在 C 和 C++ 项目中创建包含/目录?

c - C 中的简单指针问题 - 错误值

c - 指向链表指针数组的指针

algorithm - 如何提高CUDA中needleman-wunsch算法的性能

multidimensional-array - 在CUDA中的设备内存上分配2D阵列

C程序逐行读取文本文件时添加空格

c - 左值需要作为赋值的左操作数吗?

c++ - static_cast 是否会使编译器分配比 new 运算符所指的空间更多的空间?

c - 如何在 C 中转换一个 void 函数指针?

c++ - 了解 CUDA shfl 指令