向量乘法程序中的奇怪CUDA行为

时间:2010-07-02 20:00:47

标签: vector cuda multiplication

我在使用非常基本的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。根据我的理解,每次乘法都会有一个主题,因此NnThreads应该相等。

问题如下

  1. 我首先使用N=16nThreads<16调用内核,但这不起作用。 (没关系)
  2. 然后我用N=16nThreads=16调用它,效果很好。 (再次 按预期工作)
  3. 但是,当我使用N=16nThreads<16调用它时,它仍然有效!
  4. 我不明白为什么最后一步不会像第一步那样失败。如果我重新启动电脑,它只会再次失败。

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

不知道是否可以回答我自己的问题,但我发现在比较主机和设备向量时我的代码中有一个错误(代码的一部分没有发布)。抱歉给你带来不便。有人可以关闭这篇文章,因为它不会让我删除它吗?