1

我一直在尝试分配一个可以被每个内核函数访问的变量。我的尝试是下面附加的代码,但它不会编译,因为内核无法查看 dArray 访问。在 C++ 中,您可以将变量放在顶部或声明静态以在整个程序的每个范围内访问。

__global__ void StoreThreadNumber()
{
    dArray[threadIdx.x] = threadIdx.x;
}

int main( int argc, char** argv)
{
    unsigned __int8 Array[16] = { 0 };
    unsigned __int8 dArray[16];

    for( __int8 Position = 0; Position < 16; Position++)
        cout << Array[Position] << " ";
    cout << endl;

    cudaMalloc((void**) dArray, 16*sizeof(__int8));
    cudaMemcpy( dArray, Array, 16*sizeof(__int8), cudaMemcpyHostToDevice);

    StoreThreadNumber<<<1, 16>>>();

    cudaMemcpy( Array, dArray, 16*sizeof(__int8), cudaMemcpyDeviceToHost);

    for( __int8 Position = 0; Position < 16; Position++)
        cout << Array[Position] << " ";
    cout << endl;

    cudaFree(dArray);
}
4

2 回答 2

5

您可以在 CUDA 中拥有类型为__device____constant__. 因此,例如,如果您使用 将__constant__指针变量初始化为设备指针的地址,cudaMemcpyToSymbol()则可以通过该__constant__变量访问该指针:

__constant__ int* dArrayPtr;

__global__ void StoreThreadNumber()
{
    dArrayPtr[threadIdx.x] = threadIdx.x;
}

只需确保在运行内核之前从主机代码正确初始化 dArrayPtr。

于 2011-05-12T01:51:29.380 回答
2

你不能。您必须将指向 dArray 的指针传递给内核。

我遇到了同样的问题,必须将大量全局数据传递给 gpu。我最终将它全部包装在一个结构中并传递一个指向它的指针。

于 2011-05-11T11:52:42.547 回答