【问题标题】:How can I make a parameter vector local for each Kernel in Cuda如何为 Cuda 中的每个内核创建一个本地参数向量
【发布时间】:2011-10-26 21:15:35
【问题描述】:

如何在 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
}

谢谢!

【问题讨论】:

  • N 表示什么?每个数组的长度?
  • 您是否访问每个块的所有文本元素?你的内核配置如何?

标签: c nvidia cuda


【解决方案1】:

每个线程都将接收相同的输入参数,因此在这种情况下,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,但您将付出性能代价。

【讨论】:

  • 您不能在内核中调用主机函数。您的方法应该使用共享内存来完成
  • @pQB:Fermi 支持内核内 malloc,这正是答案中所指出的:'请注意,我假设你有 sm_20 或更高版本'
  • 汤姆:我很抱歉。我虽然比我读的快。 @talonmies:感谢您的评论
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
相关资源
最近更新 更多