在.cu文件有:
device int count = 0;
global void kernel_fun(){
int count_tmp = atomicAdd(&count,1);
…
}
extern “C” void test(){
kernel_fun<<<>>>();
}
下面是.cpp文件;
for(int i=0;i<5;i++)
test();//怎样实现,每次调用test时,在.cu中count都是从 0 开始
在.cu文件有:
device int count = 0;
global void kernel_fun(){
int count_tmp = atomicAdd(&count,1);
…
}
extern “C” void test(){
kernel_fun<<<>>>();
}
下面是.cpp文件;
for(int i=0;i<5;i++)
test();//怎样实现,每次调用test时,在.cu中count都是从 0 开始
您可以在kernel里面添加对count的清零操作
global void kernel_fun()
{ int tid=blockIdx.x*blockDim.x+threadIdx.x;
if tid==0
count=0;
__syncthreads();
int count_temp=atomicAdd(&count,1);
C[count_temp]=A[tid]+B[tid];
…
}
或者也可以在host端代码上每次调用kernel之前对count清零,比如说,您可以在将kernel封装到test()时增加一行
void test()
{
cudaMemset(&count,0,sizeof(int));——这个是错误的写法,请掘坟鞭尸挫骨扬灰以免贻害大家
kernel_fun<<<>>>();
…
}
使用__device__ 定义的global memory的变量,需要先取回地址保存在host端的指针变量中,才可以使用cudaMemset()函数清零。
int* count_ptr=NULL;
…
void test()
{
cudaGetSymbolAddress((void**) &count_ptr,“count”);
cudaMemset(count_ptr,0,sizeof(int));
kernel_fun<<<>>>();
…
}
上述两种用法推荐使用在kernel里面对count清零的做法。
前次答错深表歉意,希望没有对您造成误导,祝您编码愉快~
int* count_ptr=NULL;
…
void test()
{
cudaGetSymbolAddress((void**) &count_ptr,“count”);
cudaMemset(count_ptr,0,sizeof(int));
kernel_fun<<<>>>();
…
}
这样做法结果不对诶
报错了么?还是结果不对呢?目测似乎应该是可以的。
方便的话请反馈下问题,我明天写段测试看下。
推荐先使用kernel内部清零解决,这种方法是更为推荐的做法。
祝您编码顺利~
我简单测试了一下,2#中最后给出的在host端对count变量清零的方法似乎是可行的,代码和结果如下:
#include "cuda_runtime.h"
#include <stdio.h>
__device__ int count=0;
int* count_ptr=NULL;
__global__ void Kernel()
{
int tid=blockIdx.x*blockDim.x+threadIdx.x;
atomicAdd(&count,1);
__syncthreads();
if (tid==0)
{
printf("count=%d \n",count);
}
return;
}
void test()
{
cudaGetSymbolAddress((void**)&count_ptr,"count");
cudaMemset(count_ptr,0,sizeof(int));
Kernel<<<1,128>>>();
return;
}
int main()
{
for (int i=0;i<3;++i)
{
test();
}
cudaDeviceReset();
return 0;
}
[attach]2889[/attach]
可见每次循环都是先将count清零之后的结果。
供LZ参考,祝LZ编码愉快~
我重新检查的相关的资料,发现2#的一个问题,可能会影响到您,深表歉意。
具体情况如下:
关于cudaGetSymbolAddress()这个函数的第二个参数,在部分版本的CUDA上,可以是变量或者变量名的字符串,而在最新的CUDA5中已经去除了的字符串用法的支持。(同时未知来源的传言表示,之前的版本也有出现使用字符串造成失败的情况)。
根据CUDA 5手册的说法,字符串的用法在CUDA 4.1开始不推荐使用,并在CUDA 5里面移除。
[attach]2891[/attach]
所以,您可以将2#代码中cudaGetSymbolAddress()函数的第二个参数,从"count"改为count试试看。
上次回答考虑不周尽请见谅,祝您编码愉快~