2010-07-02 49 views
1

我在使用非常基本的CUDA程序时遇到了一些麻烦。我有一个程序在主机和设备上乘以两个向量,然后比较它们。这工作没有问题。什么是错误的是,我试图测试不同数量的线程和块为学习目的。我有以下的内核:向量乘法程序中奇怪的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它仍然工作!

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

有没有人遇到以前这样的事情,也可以解释这种现象?

回答

1

不知道它的确定回答我的问题,但我意识到我有一个错误在我的代码比较主机和设备载体(代码的那部分未张贴)时。抱歉给你带来不便。有人可以关闭这个帖子,因为它不会让我删除它吗?

+1

只需将此响应标记为答案,然后即可关闭。 – 2010-07-03 20:12:13

+0

ok,ty,现在可以关闭了。 – kirbuchi 2010-07-05 20:27:37

2

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

+0

是的,我打了三个连续的电话,但程序的不同实例。是的,我释放内存: cudaMalloc((无效**)vector_a_d,vector_size)在节目的最后分配 和 freeCUDA(vector_a_d)。 注意:起初我也认为这是问题所以我加倍检查内存被释放 – kirbuchi 2010-07-02 20:22:30

+0

嗯。老实说,我几个月没有碰过CUDA。尽管我在使用它时遇到了一些问题,但我在家里还是有一些笔记。稍后当我回家时我会检查这些。对不起,我现在没有更多的帮助。 – 2010-07-02 20:41:03

+0

嘿,没关系。感谢您的回答。我会继续尝试并在CUDA论坛上询问是否能幸运。 – kirbuchi 2010-07-02 20:46:07