1

我在使用非常基本的 CUDA 程序时遇到了一些问题。我有一个程序,它将主机和设备上的两个向量相乘,然后比较它们。这没有问题。问题是我正在尝试测试不同数量的线程和块以用于学习目的。我有以下内核:

__global__ void multiplyVectorsCUDA(float *a,float *b, float *c, int N){
    int idx = threadIdx.x;
    if (idx<N) 
        c[idx] = a[idx]*b[idx];
}

我称之为:

multiplyVectorsCUDA <<<nBlocks, nThreads>>> (vector_a_d,vector_b_d,vector_c_d,N);

目前我已经固定nBLocks为 1 所以我只改变向量大小N和线程数nThreads。据我了解,每次乘法都会有一个线程,因此N应该nThreads相等。

问题如下

  1. 我首先用它调用内核,N=16nThreads<16不起作用。(还行吧)
  2. 然后我用它来调用它,N=16nThreads=16工作正常。(再次按预期工作)
  3. 但是当我调用它时N=16nThreads<16仍然有效!

我不明白为什么最后一步不像第一步那样失败。如果我重新启动我的电脑,它只会再次失败。

有没有人遇到过这样的事情或者可以解释这种行为?

4

2 回答 2

2

等等,那你是连续打电话给三个人吗?我不知道您的其余代码,但是您确定要清除每次运行之间分配的图形内存吗?如果不是,这可以解释为什么它第一次不起作用,但在您传递相同的值时第三次起作用,以及为什么它只能在重新启动后再次起作用(重新启动会清除所有分配的内存)。

于 2010-07-02T20:13:41.133 回答
1

不知道是否可以回答我自己的问题,但我意识到在比较主机和设备向量时我的代码中有一个错误(那部分代码没有发布)。带来不便敬请谅解。有人可以关闭这个帖子,因为它不会让我删除它吗?

于 2010-07-03T03:25:21.450 回答