编译通过结果出错,求解释

#include <stdio.h>

#include <stdlib.h>

#include

#include <cuda.h>

#include “cuda_runtime.h”

#include “device_launch_parameters.h”

using namespace std;

#define BLOCK_SIZE 32

#define GRID_SIZE 14

// Kernel definition

global void VecAdd(int* A, int* B, int* C) {

   int i =threadIdx.x;

   int j =blockIdx.x;

   int n =32*j+i;

   

   for (int j = 0; j < 100000000 ; j++ ){

          C[i] =A[i] + B[i];

   }

}

int main() {

   size_t size =BLOCK_SIZE*GRID_SIZE*sizeof(int);



   int* A =(int*)malloc(size);

   int* B =(int*)malloc(size);

   int* C =(int*)malloc(size);



   for (int i =0 ; i < BLOCK_SIZE*GRID_SIZE ; ++i) {

          A[i]=(int)i;

          B[i]=(int)i;

   }



   int* gA;

   cudaMalloc((void**)&gA,size);

   cudaMemcpy(gA,A,size,cudaMemcpyHostToDevice);



   int* gB;

   cudaMalloc((void**)&gB,size);

   cudaMemcpy(gB,B,size,cudaMemcpyHostToDevice);



   int* gC;

   cudaMalloc((void**)&gC,size);



   dim3grid(GRID_SIZE , 1 , 1);

   dim3block(BLOCK_SIZE , 1 , 1);



   VecAdd<<<grid, block>>>(gA, gB, gC);



   cudaMemcpy(C,gC,size,cudaMemcpyDeviceToHost);



   for (intj=0;j<BLOCK_SIZE*GRID_SIZE;++j) {

          printf("%d\t%d\n",C[j],j);

   }



   cudaFree(gA);

   cudaFree(gB);

   cudaFree(gC);



   free(A);

   free(B);

   free(C);



   return 0;

}

以上为程序的源代码,在windows7 的VS2010中编译通过,但是结果不正确:

[attach]3038[/attach]

正确结果应该是每一行的第一个数是第二个数的两倍,求解释??

然后就是,我在linux下编译这段代码的时候,是可以输出正确结果的,但是有个问题就是,系统重启之后,直接运行.out文件的话,输出的结果就变成了全是0,这时候要运行另外一段代码,然后再运行.out文件才能出正确结果,求解释其原理??

楼主你好,您的代码kernel是有问题的。C=A+B并不能运算整个向量。按照您前面的变量定义,应该写成C[n]=A[n]+B[n]。而且,上面那个j循环,也没看懂你是想做什么(如果您只是想做向量加法的话,建议去掉)。
至于您说linux得到了正确的结果,感到很费解~~
至于linux系统重启之后要运行其他程序才能运行.out,一般是由于nvidia显卡模块没有正确挂载所致。(请问您默认启动模式是 init 3吗?)一般如果您要是开启了图形界面,应该不会出现那个问题(将启动模式改成init 5或者sudo gdm start)。也可以按照官方linux start文档配置开机自动挂在nvidia模块。