我正在从事 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/