为什么输出一直是零啊

#include “cuda_runtime.h”
#include “device_launch_parameters.h”
#include <stdio.h>

constant int dev_a[144] , dev_b[144] ;
global void addKernel(int *dev_c, int size ,int TILE_WIDTH)
{

int Row = blockIdx.y * TILE_WIDTH + threadIdx.y;
int Col = blockIdx.x * TILE_WIDTH + threadIdx.x;
int pvalue=0;
for(int k=0;k<size;++k)
{
int Mdelement = dev_a[Rowsize+k];
int Ndelement = dev_b[k
size+Col];
pvalue += Mdelement * Ndelement;
}
dev_c[Row*size+Col]=pvalue;
}

int main()
{
const int arraySize = 12;
const int a[arraySizearraySize] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , 11, 12,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , 11, 12,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , 11, 12,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , 11, 12,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , 11, 12,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , 11, 12};
const int b[arraySize
arraySize]= { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120,10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120,
10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120,
10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120,
10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120,
10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120,
10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100,110, 120};
int c[arraySize*arraySize] = { 1 };
int *dev_c ;
int TILE_WIDTH = 4;

cudaMalloc((void**)&dev_c, (arraySize * arraySize) * sizeof(int));
cudaMemcpy(dev_a, a, (arraySize * arraySize) * sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(dev_b, b, (arraySize * arraySize) * sizeof(int), cudaMemcpyHostToDevice);

dim3 dimBlock(TILE_WIDTH,TILE_WIDTH);
dim3 dimGrid(arraySize/TILE_WIDTH,arraySize/TILE_WIDTH);

addKernel<<<dimGrid, dimBlock>>>(dev_c, arraySize,TILE_WIDTH);
cudaMemcpy(c, dev_c, (arraySize * arraySize) * sizeof(int), cudaMemcpyDeviceToHost);//为什么dev_a和dev_b都是 0 啊
cudaMemcpy(c, dev_a, (arraySize * arraySize) * sizeof(int), cudaMemcpyDeviceToHost);//这句话是不是没有执行为什么啊!!!!!!!!!
int j = 1;
for( int i=0;i<144;i++)
{

printf(“%6d”,c[i]);

if(j%12==0)
{
printf(“\n”);
j=0;
}
j++;
}
cudaFree(dev_c);
cudaFree(dev_a);
cudaFree(dev_b);
return 0;
}

[/i]

在线等大神解答

显存上没有分配dev_a和dev_b

LZ您好:

大致看了下您的代码,一个明显的问题(也是您注释中表示不解的地方)在于您对__constant__定义的数组的赋值方式是错误的。如果您使用nsight观察dev_a和dev_b的值会发现他们根本没有正确得到数值,以及如果您逐步检查返回值,应该可以发现问题。

对于__device__定义的数组以及隐含有__device__属性的__constant__数组,不能使用cudaMemcpy()进行赋值,而要么使用cudaMemcpyToSymbol()进行赋值,要么使用cudaGetSymbolAddress()获得实际的地址,然后再作为cudaMemcpy()的参数使用。

同样地,回拷过程也应该使用cudaMemcpyFromSymbol()。

您可以在CUDA C Programming Guide和CUDA Toolkit Reference Manual里面找到上述API函数的详细信息。

大致如此,供您参考。

祝您编码顺利~

感谢您积极回帖参与讨论!

LZ显存上分配了dev_a和dev_b,不过用法不正确。

详细信息已在4#给出,欢迎就LZ的问题继续补充看法~

祝您好运~

这样啊。。孤陋寡闻了,没见过这种分配方式

您好:

使用__device__或者__constant__定义一个device端的全局变量/数组,的确是可以的,这相当于一个device端的全局变量/数组,无需传递参数就可以在kernel中使用。

以及__constant__还表明了在kernel执行中,变量/数组中的 数值是不会变的,编译器可以利用constant cache来进行缓冲,以取得更好的效果。

但是这种用法经常容易产生各种混乱,所以__device__变量/数组一般建议直接cudaMalloc()代替。因而这样的用法也确实不常见的。

大致如此,供您参考。

欢迎您积极参与回帖讨论,祝您编码顺利~

还有问题斑竹,我用cudaMemcpyToSymbol()提示在__constant__定义的数组只能是char型的啊,没有更改时仍然时零

LZ您好:

__constant__变量并没有限定为char类型,请您贴出您的代码和具体报错以便分析。

祝您好运~

cudaMemcpyToSymbol(dev_a, a, (arraySize * arraySize) * sizeof(int));
cudaMemcpyToSymbol(dev_b, b, (arraySize * arraySize) * sizeof(int));
将cudaMemcpy更改后输出全都是零而且将鼠标放到上面变量dev_a和dev_b上都显示了一句话
Error:argument of type “int *” is incompatible with parameter of type “const char”

LZ您好:

请看截图
[attach]3297[/attach]

这样copy分明是可以的。

祝您编码顺利~

斑竹,成功了,为什么这个先下面会有这个显示啊,:loveliness:

我没有遇到这种现象,这应该只是智能感知提示的。(因为您可以成功编译运行)

请确保如下几点:
(1)您的项目的include目录中包含您安装cuda toolkit的那个目录下的include文件夹。
(2)请确保您#include了cuda_runtime.h

一般确保这2点,智能感知的红线就会消失。

也可能是别的原因干扰的,但建议您检查下这2点。
(显然这个提示是错误的,您要写入的目标还被提示const char *呢,显然不对的)
(但您也可以直接忽略智能感知的提示)

谢谢斑竹,为了这个__constant__的初始化花费了好长时间,您们还耐心的解答,好感动!!

您客气了,服务您是我和ICE的荣幸。

感谢来访。:slight_smile:

学习了。。。。

楼主您好:

不建议无意义的“顶”,“up", “赞”,

(如果您需要CUDA币,可以去水区发帖,获得它们)
(下次您的无意义回复将被删除,特此告知您一声)。

感谢周末深夜来访。