CUDA实现数组倒序

数组倒序,将在主机上初始化的数组传输到设备上,然后用CUDA并行倒序,此时在全局内存上操作,再将结果返回到主机并验证。

 1 #include <stdio.h>
 2 #include <assert.h>
 3 #include "cuda.h"
 4 #include "cuda_runtime.h"
 5 #include "device_launch_parameters.h"
 6 //检查CUDA运行时是否有错误
 7 void checkCUDAError(const char* msg);
 8 // Part3: implement the kernel
 9 /*
10 blockDim块内的线程数
11 blockIdx网格内的块索引
12 gridDim网格内块个数
13 threadIdx块内线程索引
14 */
15 __global__ void reverseArrayBlock(int *d_out, int *d_in)
16 {
17     int inOffset = blockDim.x * blockIdx.x;
18     int outOffset = blockDim.x * (gridDim.x - 1 - blockIdx.x);
19     int in = inOffset + threadIdx.x;
20     int out = outOffset + (blockDim.x - 1 - threadIdx.x);
21     d_out[out] = d_in[in];
22 }
23 /////////////////////////////////////////////////////////////////////
24 //主函数
25 /////////////////////////////////////////////////////////////////////
26 int main(int argc, char** argv)
27 {
28     //指向主机的内存空间和大小
29     int *h_a;
30     int dimA = 256 * 1024; // 256K elements (1MB total)
31     //指向设备的指针和大小
32     int *d_b, *d_a;
33     //定义网格和块大小,每个块的线程数量
34     int numThreadsPerBlock = 256;
35
36     /*
37     根据数组大小和预设的块大小来计算需要的块数
38     */
39     int numBlocks = dimA / numThreadsPerBlock;
40     //申请主机及设备上的存储空间
41     size_t memSize = numBlocks * numThreadsPerBlock * sizeof(int);
42     //主机上的大小
43     h_a = (int *)malloc(memSize);
44     //设备上的大小
45     cudaMalloc((void **)&d_a, memSize);
46     cudaMalloc((void **)&d_b, memSize);
47     //在主机上初始化输入数组
48     for (int i = 0; i < dimA; ++i)
49     {
50         h_a[i] = i;
51     }
52     //将主机数组拷贝到设备上,h_a-->d_a
53     cudaMemcpy(d_a, h_a, memSize, cudaMemcpyHostToDevice);
54     //启动内核
55     dim3 dimGrid(numBlocks);
56     dim3 dimBlock(numThreadsPerBlock);
57     reverseArrayBlock <<< dimGrid,    dimBlock >>>(d_b, d_a);
58     //阻塞,一直到设备完成计算
59     cudaThreadSynchronize();
60     //检查是否设备产生了错误
61     //检查任何CUDA错误
62     checkCUDAError("kernel invocation");
63     //将结果从设备拷贝到主机,d_b-->h_a
64     cudaMemcpy(h_a, d_b, memSize, cudaMemcpyDeviceToHost);
65     //检查任何CUDA错误
66     checkCUDAError("memcpy");
67     //核对返回到主机上的结果是否正确
68     for (int i = 0; i < dimA; i++)
69     {
70         assert(h_a[i] == dimA - 1 - i);
71     }
72     //释放设备内存
73     cudaFree(d_a);
74     cudaFree(d_b);
75     //释放主机内存
76     free(h_a);
77     printf("Correct!\n");
78     return 0;
79 }
80 void checkCUDAError(const char *msg)
81 {
82     cudaError_t err = cudaGetLastError();
83     if (cudaSuccess != err)
84     {
85         fprintf(stderr, "Cuda error: %s: %s.\n", msg,cudaGetErrorString(err));
86         exit(EXIT_FAILURE);
87     }
88 }
时间: 2024-08-06 23:35:11

CUDA实现数组倒序的相关文章

cuda 寄存器数组使用解析

关于cuda寄存器数组 在基于cuda对一些算法做并行优化时,为了尽可能的提高算法的运行速度,有时我们会想要用寄存器数组使得算法飞一般的快,然而,效果却总是差强人意.用了竟然比没用快,这是为什么呢? 哈哈,说重点,我们定义寄存器数组有以下两种方式: 1       Inta[8]; 此时,我们定义的数组真的是我们想要的寄存器数组吗?这样的定义,编译器将我们定义的"寄存器数组"放在了 local memory,而local memory 就是在显存中开辟的一块空间,速度怎么可能会快? 2

将一个有序数组倒序输出

拿到有个题目对于初学者来说不能直接写代码程序:因为如果没有完全理解其中的思想写起来是很困难的,首先我们要学会分析问题,然后给出解题方法. 下面我将以一个实例进行解释说明:代码如下: package Demo; public class ArrayDaoXu {/** * 数组的倒序输出 * @param args */ public static void main(String[] args) { // TODO 自动生成的方法存根 int arr[]={1,2,3,4,5,6,7,8,9};

C语言数组倒序排列

#include <stdio.h> #pragma mark 数组的倒序排列 int main() { int array[5] = {1, 3, 2, 4, 5}; /*方法一:*/ for (int i = 0; i<5/2; i++) { int temp = array[i]; array[i] = array[4-i]; array[4-i] = temp; } /*方法二:*/ int i = 0, j = 4; while (i<j) { int temp = ar

用枚举器遍历数组倒序输出数组

//下边的例子可以把数组元素逆序输出 #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) {    @autoreleasepool {        NSArray *array = @[@"1",@"a",@"c",@"e"];        NSEnumerator *unum;        unum = [ar

CUDA三维数组

http://hpcbbs.it168.com/forum.php?mod=viewthread&tid=1643 根据上面链接的帖子研究了下三维数组,就像他自己说的一样是有问题的,我自己修改了下,结果终于正确了.大家有兴趣的可以对照着看看. 整个过程关键参考了这篇文章http://www.xuebuyuan.com/685353.html 1 #include <stdio.h> 2 //#include <cutil.h> 3 #include <helper_c

php - 数组倒序

array_reverse(返回一个单元顺序相反的数组) 适用(PHP 4, PHP 5) 说明: array array_reverse ( array $array [, bool $preserve_keys = false ] ) array_reverse() 接受数组 array 作为输入并返回一个单元为相反顺序的新数组. 参数: array 输入的数组. preserve_keys 如果设置为 TRUE 会保留数字的键. 非数字的键则不受这个设置的影响,总是会被保留. 返回值:ar

ios数组倒序

比如有一个数组: NSArray *arr = @[@"1", @"2", @"3"]; 倒过来排序: arr = [[arr reverseObjectEnumerator] allObjects]; NSMutableArray *accountArr = [NSMutableArray arrayWithContentsOfFile:filePath]; self.accountArr = (NSMutableArray *)[[accou

数组倒序

NSMutableArray *array = [NSMutableArray arrayWithObjects:@"1",@"2",@"3",nil]; NSArray* reversedArray = [[array reverseObjectEnumerator] allObjects];

ios 数组倒序和数组转字符串

NSMutableArray *array = [NSMutableArray arrayWithObjects:@"1",@"2",@"3",nil]; NSArray* reversedArray = [[array reverseObjectEnumerator] allObjects]; NSLog(@"%@",reversedArray); NSArray *array1 = [NSArray arrayWithOb