用户
 找回密码
 立即注册
洛欣 该用户已被删除
发表于 2009-11-18 10:39:43
82813
有两个cuda API 提供的函数,一直没搞明白:

(1) cudaError_t cudaMemset (void ∗ devPtr, int value, size_t count)说是将由devptr指向的存储区域中前count个字节的值设置为value. 但是我发现只能全部设置成0, 如果设置成其他的值就不对,比如:

cudaMemset(devPtr, 6, mem_size),然后写一个kernel将devptr中的每个数加上4,但返回来的就过并不是10,而是一个非常大的数,不知道为什么?不知道错在哪?

(2)关于将host中的数据拷贝到gpu的constant memory,我用的函数是cudaMemcpyToSymbol,虽然编译没错,但运行时,kernel没有启动,但是将constant memory换成device memory就没事,不知道错在那了?还请 指教。
我是这样用的:

__constant__ int *d_A=NULL;
cudaMalloc((void **)&d_A, mem_size_A);
cudaMemcpyToSymbol(d_A, A, mem_size_A, 0, cudaMemcpyHostToDevice);
使用道具 举报 回复
发表于 2009-11-18 11:29:58
1)
cudaMemset  ( void *  devPtr,  
  int  value,  
  size_t  count  
)   

Fills the first count bytes of the memory area pointed to by devPtr with the constant byte value value

按LZ的例子每个字节都设上了6,int的话是4字节.LZ自己可以算一下,0x6666是多少?如还不清楚的话,复习一下C的memset.

2)const的空间没有声明吧.
__constant__ int *d_A=NULL;
改为
__constant__ int d_A[d_num];

下面摘自编程手册:
constant变量具有隐含的静态存储.
使用道具 举报 回复 支持 反对
发表于 2009-11-18 15:06:22
__global__ void kernel(int *d_b, int *count)
{
    int tid=blockDim.x*blockIdx.x+threadIdx.x;
    int index=tid/blockDim.x;  //同一个块内的线程的index相同

    *count++; //count初始化为0,想让每个线程都对它加1
    d_b[index]++; //d_b[DATA_SIZE/BLOCK_SIZE]初始化为0,这样同一个块内的线程就会对应于数组中的同一个元素
    __syncthreads();

这个程序的线程有问题。
使用道具 举报 回复 支持 反对
发表于 2009-11-18 19:35:14
0 0
使用道具 举报 回复 支持 反对
发新帖
您需要登录后才可以回帖 登录 | 立即注册