赋值的问题

做一个小程序,中间需要给一个实数数组赋值,采用了这样一个函数来完成赋值

void constantInit(float *data, int size2)
{
   for (int i = 0; i < size2; i++)
   {
   data[i] = 1;
   }
}

可是 打印的时候结果都是0,调用的函数如下,请教版主和大家,原因在哪里。:slight_smile:

void mscan(int m_w)

{
   
 unsigned int size = sizeof(float) * m_w;  //

   
   
   float *h_A = (float *)malloc(size);     //CPU里分配数组A的空间首地址和具体空间

   
   constantInit(h_A, m_w);      //数组A初始化
   
   
   float *h_C = (float *)malloc(size);     //CPU里分配数组C的空间首地址和具体空间

   float *d_A, *d_C,*d_E,*d_EE;

   
   cudaMalloc((void **) &d_A, size);  //设备(GPU)里分配数组A的空间首地址和具体空间

   cudaMalloc((void **) &d_C, size);   // 设备(GPU)里分配数组C的空间首地址和具体空间

   
   unsigned int size1 = sizeof(float) * d_n;
   
   cudaMalloc((void **) &d_E, size1);   // 设备(GPU)里分配数组E的空间首地址和具体空间
   
   cudaMalloc((void **) &d_EE, size1);  // 设备(GPU)里分配数组EE的空间首地址和具体空间

   
   cudaMemcpy(d_A, h_A, size, cudaMemcpyHostToDevice);  //拷贝数据去gpu

   
   scan <<< d_n, THREADBLOCK_SIZE >>>(d_C, d_A,d_E, 2*THREADBLOCK_SIZE);

   scan1 <<< 1, d_n/2 >>>(d_EE, d_E,d_n);

   add <<< d_n, THREADBLOCK_SIZE >>>(d_C, d_EE, 2*THREADBLOCK_SIZE);

   
	 cudaMemcpy(h_C, d_C, size, cudaMemcpyDeviceToHost);   //拷贝数据回cpu
   
   
  


	for (int i = 0; i < 10  ; i++)
   {
   printf("%d",h_A[i]);
		
   }
	  cudaDeviceReset();
	
  
   
}

楼主您好,您的代码可以大致分为:

float *h_A = (float *)malloc(m_w * sizeof(float));
for (int i = 0; i < m_w; i++) h_A[ i ] = i;
//一堆无关的cuda函数调用和kernel
for (int i = 0; i < 10; i++) printf(“…”, h_A [ i]);

那么,因为中间的代码完全和h_A无关,所以:
只要您能保证m_w > 1,则最后的10次循环将显示出:0,1,2,3…
(因为您的代码中间部分完全和h_A无关的,所以只是一个分配,初始化,显示的过程)

而这三步中:
显然后2步不会出错。
那么最大的可能是第一步。

而第一步在某些情况下(例如m_w = 1)会导致可能显示出一串0的(想想为何)。

我把m_w直接改为了10 constantInit(h_A, 10); //数组A初始化
可是输出的还是10个0,我感觉没有什么错误晕了

如果您发的代码是正确的,并且已经重新rebuild all了。
那么:

上文分析的:
(1)分配空间
(2)初始化缓冲区
(3)显示刚刚初始化的值
这三步是无问题的,
(因为您立刻写入了一个地址,然后读取出来,却发现值变化了,这个不可理喻)

请确保您发的代码是真实无删节的。

楼主您好,刚才发现您使用了%d在printf里,这个可能会导致显示0的。

请立刻使用%f。谢谢。

(不好意思才提出这点)

晕啊 我这个笨啊 感谢版主

感谢您的来访。

祝您工作、生活愉快!