【发布时间】:2014-03-30 04:15:25
【问题描述】:
我正在从事一个 CUDA 项目。但是,这基本上是一个关于指针的 C 概念,与 CUDA 本身没有太大关系。
我不确定我的引用/解除引用指针是否正确完成以反映我的 kernel 函数上的新值(与 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()或foo2()的指针? -
@Macattack 因为我需要将值的分配反映在
kernel上。