cuda在乘法计数器中计算错误结果

cuda在乘法计数器中计算错误结果,cuda,Cuda,我正在cuda中编写代码,尝试学习一些概念,问题是: 在第@@@行中,如果我使用(i*i)它运行良好,乘法结果为真。但是当我把(i*j)计数器,而不是(i*i)放入计数器时,它会产生错误的结果。我想这可能是我的错误设置错误dimgrid和dimblock或其他东西!!!知道如何解决这个问题吗? 我把C++版本放在代码的末尾来比较结果。 谢谢你的建议 这是我的密码: #include "cuda.h" #include "stdio.h" #include "stdlib.h" #include

我正在cuda中编写代码,尝试学习一些概念,问题是:

在第@@@行中,如果我使用(i*i)它运行良好,乘法结果为真。但是当我把(i*j)计数器,而不是(i*i)放入计数器时,它会产生错误的结果。我想这可能是我的错误设置错误dimgrid和dimblock或其他东西!!!知道如何解决这个问题吗?
我把C++版本放在代码的末尾来比较结果。 谢谢你的建议

这是我的密码:

#include "cuda.h"
#include "stdio.h"
#include "stdlib.h"
#include "iostream"
#include "time.h"

double diffclock(clock_t clock1,clock_t clock2) 
{
double diffticks=clock1-clock2;
double diffms=(diffticks*10)/CLOCKS_PER_SEC;
return diffms;
} 

using namespace std;
__global__ void add( int *c)
{

int i = threadIdx.x + blockIdx.x * blockDim.x;
int j = threadIdx.y + blockIdx.y * blockDim.y;
int k = threadIdx.z + blockIdx.z * blockDim.z;
int nx,ny,nz;
nx = 512;
ny = 512 ;
nz = 51200 ;
if ((i < nx) && (j < ny) && (k < nz))
{

    *c = i*i; // **@@@**

}
}

int main()
{
printf("****************************************************************\n");
printf("                  CUDA_C COMPARISONE MODEL                          \n");
printf("\n");
printf("\n");
printf("this program will produce 512 * 512 * 51,200 for loop iteration \n");
printf("you can compare time elapsed between c++ version & cuda version \n");
printf("\n");
printf("\n");

printf("\n");
printf("****************************************************************\n");
cudaEvent_t beginEvent;
cudaEvent_t endEvent;
cudaEventCreate( &beginEvent );
cudaEventCreate( &endEvent );
int c;
int *dev_c;
cudaMalloc((void**)&dev_c, sizeof(int));
dim3 dimgrid (16 , 16);
dim3 dimblock(32 , 32);
cudaEventRecord( beginEvent, 0 );
add<<<dimgrid,dimblock>>>(dev_c);
cudaMemcpy(&c, dev_c, sizeof(int), cudaMemcpyDeviceToHost);
cudaEventRecord( endEvent, 0 );
cudaEventSynchronize( endEvent );
float timeValue;
cudaEventElapsedTime( &timeValue, beginEvent, endEvent );
printf( "Time elapsed in G-p-u : %f  ms \n" ,timeValue );
printf("_____________________________________________________\n");
printf("G-p-u multiply computation is =====>>> %d\n", c);
printf("_____________________________________________________\n");


// c++  code :

int n1 = 512 ;
int n2 = 512 ;
int n3 = 51200;

clock_t begin=clock();

int cp , ii,jj,kk;
for(kk=0; kk<n3; kk++)
  for(ii=0; ii<n2; ii++)
    for(jj=0; jj<n1; jj++)
         cp = (ii)*(jj);

clock_t end=clock();
cout << "Time elapsed in C-p-u : " << double(diffclock(end,begin)) << " ms"<< endl;
printf("_____________________________________________________\n");
printf("_____________________________________________________\n");

printf("C-p-u multiply computation is =====>>> %d\n", cp);
cudaFree(dev_c);
return 0;
}
#包括“cuda.h”
#包括“stdio.h”
#包括“stdlib.h”
#包括“iostream”
#包括“time.h”
双差分时钟(时钟1、时钟2)
{
双diffticks=时钟1-2;
双diffms=(diffticks*10)/时钟每秒;
返回diffms;
} 
使用名称空间std;
__全局无效添加(int*c)
{
int i=threadIdx.x+blockIdx.x*blockDim.x;
int j=线程IDX.y+块IDX.y*块DIM.y;
int k=threadIdx.z+blockIdx.z*blockDim.z;
新西兰纽约州内华达州;
nx=512;
ny=512;
新西兰=51200;
如果((i>>%d\n”,c);
printf(“uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
//C++代码:
int n1=512;
int n2=512;
int n3=51200;
时钟开始=时钟();
int cp,ii,jj,kk;

对于(kk=0;kk对于CPU和GPU,您都在运行许多计算。您将CPU中的一个计算与GPU中的一个计算进行比较。问题是,您没有比较同一个计算,因此您的结果当然不同。您将结果都存储在一个位置,一个在另一个位置之上。这不起作用。ordCPU上的计算顺序与GPU上的计算顺序不同


正如我所做的那样,将每个计算存储在一个单独的位置。然后,当您比较结果时,您将能够比较相应的位置,然后您的结果应该匹配。

正确的结果是什么意思?您正在向您的核函数传递一个元素,其中有一个严重的争用条件问题。@Jackolanten hi.I我的意思是,当我在c版本中进行乘法运算时,它会进行乘法运算,并生成真正的乘积,但是当我在gpu上使用i*j标记再次进行乘法运算时,乘法运算的结果是不同的。如果我写的代码是真的,那么结果一定是相同的,但为什么不是这样呢?同样,在这两种情况下,你希望得到正确的结果是什么<代码>*c=i*i
*c=i*j
?@JackOLantern嗨,谢谢你的关注。当我在c版本代码中做ij时,每次它都会产生261121作为产品的结果,但是在cuda内核中,ij每次编译后的产品都会产生不同的数字,这些数字都不一样。这让我很困惑!!!我很快就好了如果你让这个更清楚,为什么在我的CUDA代码中,i *j不产生相同的数字261121??考虑下面的事实,即你没有把你的结果存储在一个数组中,正如下面RobertCrovella的回答中所建议的,但是你只使用一个内存位置。因此,在顺序编程中,<代码> *c<代码>是UPDA。在并行编程中,所有线程都以无序的方式独立地更新
*c
。更清楚地说,假设你正在要求一群士兵执行一个命令,在你的例子中更新
*c
广告你的链接,但是,我认为这并不能解决问题,因为虽然你的c[][]的左边数组将结果存储在内存中的不同位置,但当我将维度增加到512*512*51200时,结果会损坏!!!另一个问题是,如果我想在无数组变量上保存结果,该怎么办?你的意思是我必须使用数组来解决这个问题?