如何为Cuda中的每个内核创建一个局部参数向量

时间:2011-10-26 21:15:35

标签: c nvidia cuda

如何在cuda的每个实例中将参数向量视为局部变量?

__global__ void kern(char *text, int N){
//if i change text[0]='0'; the change only affects the current instance of the kernel and not the other threads
}

谢谢!

1 个答案:

答案 0 :(得分:2)

每个线程都会收到相同的输入参数,因此在这种情况下char *text在每个线程中都是相同的 - 这是编程模型的基本部分。由于指针指向全局内存,如果一个线程通过指针更改数据(即修改全局内存),则更改会影响所有线程(忽略危险)。

这与标准C完全相同,但现在您有多个线程通过指针访问。换句话说,如果在标准C函数内修改text [0],则更改在函数外部可见。

如果我理解正确,你要求每个帖子都有text内容的本地副本。如果您不希望在函数外部看到更改,则解决方案与标准C完全相同:

__global__ void kern(char* text, int N) {
    // If you have an upper bound for N...
    char localtext[NMAX];
    // If you don't know the range of N...
    char *localtext;
    localtext = malloc(N*sizeof(char));

    // Copy from text to localtext
    // Since each thread has the same value for i this will
    // broadcast from the L1 cache
    for (int i = 0 ; i < N ; i++)
        localtext[i] = text[i];

    //...
}

请注意,我假设你有sm_20或更高版本。另请注意,虽然可以在设备代码中使用malloc,但您需要支付性能价格。