CUDA判断素数的程序

http://blog.csdn.net/smsmn/article/details/6315160 

调用核函数:IsPrime<<<dimGrid,dimBlock>>>()
但是程序里使用的是: IsPrime<<<BLOCK_NUM, THREAD_NUM, THREAD_NUM  sizeof ( bool )>>>gpudata, result,time);
三个参数,第三个是共享内存的大小。
程序是这样做的,每个块block统一一个结果,因为有共享内存供同一个块共享。
result[bid]= false ;  每个块得出result bool值数组的一个位置。
bool  shared[];的大小呢就是每个块中线程的大小。
1:
每个具体的线程,即blockid的某个threadid的线程,所计算的是一个数或者好几个数,怎么说呢,总共有block_NUM*THREAD_NUM这么多的线程,假设要计算素数test,则必须对所有从2,3,4...到test-1这么多数做除法运算,总共应该是test-1个数,这些数就按顺序安排到 block_NUM*THREAD_NUM这些线程上运行,多出来的再次重复的安排也就是说i和 += BLOCK_NUM THREAD_NUM都应该是安排在同一个线程块的同一个线程id上运行。
2:
每个线程块中的shared[]的数据怎么综合到一个全局的result[]的一个值上去呢。我们知道result是通过 cudaMalloc(( void **) &result,  sizeof ( bool )*BLOCK_NUM);  分配的内存,所以是全局内存。
而且在什么时候综合这也是个问题,应该是在每个块里面的最后一个线程上综合。

关于关键字:_syncthreads(),共享内存只有在执行_syncthreads()后才能使共享变量对其他线程可见。
可以调用它在内核中指定同步点,块中所有线程都必须在这里等待处理。
  1.   if(tid == 0)  
  2.      
  3.         for(i=0;i<THREAD_NUM;i++)  
  4.          
  5.             if(shared[i])  
  6.              
  7.                 result[bid]=true 
  8.              
  9.   
  10.          
  11.      
  12.     if(tid == 0)   
  13.         time[bid BLOCK_NUM] clock();  
  14.   
  15.     time[bid BLOCK_NUM] clock();  

代码又使得我们不会同步后在块中每个线程里都做归一处理,只在tid=0的线程。
volatile是一个类型修饰符(type specifier)。它是被设计用来修饰被不同线程访问和修改的变量。

关于clock_t,程序中用来计算时间,time的大小是,2*BLOCK_NUM,因为每个block要记一个开始时间还要记一个结束时间。最后作者还计算了最早块开始时间,和块的最晚结束时间。

cudaMalloc分配的是全局内存
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
如果您需要使用CUDA来加速您的程序,您可以尝试以下步骤: 1. 安装CUDA Toolkit:您可以从NVIDIA官网下载CUDA Toolkit,并按照安装说明进行安装。 2. 配置开发环境:您需要在您的开发环境中配置CUDA,以便编写和编译CUDA程序。您可以在CUDA Toolkit安装目录中找到相关的开发工具和库文件。 3. 编写CUDA程序:您可以使用CUDA C/C++编写CUDA程序。在编写CUDA程序时,您需要将需要加速的计算逻辑调用CUDA函数,并将数据传输到GPU上进行计算。 以下是一个简单的CUDA示例程序,可以将两个向量相加: ```c++ #include <stdio.h> __global__ void add(int *a, int *b, int *c) { int tid = blockIdx.x; // 计算线程ID if (tid < N) { c[tid] = a[tid] + b[tid]; // 计算两个向量相加 } } int main() { int a[N], b[N], c[N]; // 定义两个向量和结果向量 int *dev_a, *dev_b, *dev_c; // 定义GPU上的向量指针 // 分配GPU内存 cudaMalloc((void**)&dev_a, N * sizeof(int)); cudaMalloc((void**)&dev_b, N * sizeof(int)); cudaMalloc((void**)&dev_c, N * sizeof(int)); // 初始化向量 for (int i = 0; i < N; i++) { a[i] = i; b[i] = i * 2; } // 将向量传输到GPU cudaMemcpy(dev_a, a, N * sizeof(int), cudaMemcpyHostToDevice); cudaMemcpy(dev_b, b, N * sizeof(int), cudaMemcpyHostToDevice); // 启动kernel计算 add<<<N, 1>>>(dev_a, dev_b, dev_c); // 将计算结果传输回CPU cudaMemcpy(c, dev_c, N * sizeof(int), cudaMemcpyDeviceToHost); // 打印结果 for (int i = 0; i < N; i++) { printf("%d + %d = %d\n", a[i], b[i], c[i]); } // 释放GPU内存 cudaFree(dev_a); cudaFree(dev_b); cudaFree(dev_c); return 0; } ``` 这个程序使用了CUDA的核心概念:kernel函数、线程ID、GPU内存分配和数据传输。您可以根据自己的需要修改这个程序,并使用CUDA加速您的程序

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zlingh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值