OpenCL性能对比测试案例,合理使用clfinish()函数,充分发挥指令队列(commandqueue)特性。

用的公司的电脑,配置如下:

CPU: AMD Athlon X4 830 (3.0GHz 四核)

内存: 8GB


GPU: nVIDIA GT710 (0.954GHz 192cores 1CU)

显存: 1GB


上图,浮点性能测试。


CPU的 float 浮点性能 91.95GFlops。GPU为 320.1GFlops。浮点数计算 GPU领先 3倍多。

然而 这是面对简单计算任务的情况。算是理想性能,不是项目的实际情况。


----------------------------

下面上案例分析:这是一个矩阵加法的测试项目。水平有限,性能一般般。两个矩阵相加,重复1000次。评估单次计算的耗时。

 /// <summary>
        /// func opencl特性测试,host to gpu 传输特性。
        /// </summary>
        [TestMethod]
        public void NC07_gpu()
        {
            string code = OpenCLMode.OCL.oclModel.LoadCode(filename);
            oclm = new OpenCLMode.OCL.oclModel(code);

            int i = 100, j = 100;

            float[,] A = new float[i, j];
            float[,] B = new float[i, j];
            float[,] C = new float[i, j];
            RandomData(A);//产生随机数据
            RandomDa
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
以下是一个简单的 OpenCL 使用示例,它执行向量加法: ```c #include <stdio.h> #include <stdlib.h> #include <CL/cl.h> #define LENGTH 1024 const char *kernelSource = "__kernel void vectorAdd(__global float *a, __global float *b, __global float *c) {\n" " int i = get_global_id(0);\n" " c[i] = a[i] + b[i];\n" "}\n"; int main() { cl_platform_id platform; cl_device_id device; cl_context context; cl_command_queue queue; cl_program program; cl_kernel kernel; cl_mem a, b, c; cl_int err; int i; float *A, *B, *C; // 初始化 A, B, C 数组 A = (float*) malloc(sizeof(float) * LENGTH); B = (float*) malloc(sizeof(float) * LENGTH); C = (float*) malloc(sizeof(float) * LENGTH); for (i = 0; i < LENGTH; i++) { A[i] = (float) i; B[i] = (float) (LENGTH - i); C[i] = 0.0f; } // 获取平台和设备 err = clGetPlatformIDs(1, &platform, NULL); err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device, NULL); // 创建 OpenCL 上下文和命令队列 context = clCreateContext(NULL, 1, &device, NULL, NULL, &err); queue = clCreateCommandQueue(context, device, 0, &err); // 创建和编译内核程序 program = clCreateProgramWithSource(context, 1, &kernelSource, NULL, &err); err = clBuildProgram(program, 1, &device, NULL, NULL, NULL); // 创建内核 kernel = clCreateKernel(program, "vectorAdd", &err); // 创建和设置缓冲区 a = clCreateBuffer(context, CL_MEM_READ_ONLY, sizeof(float) * LENGTH, NULL, &err); b = clCreateBuffer(context, CL_MEM_READ_ONLY, sizeof(float) * LENGTH, NULL, &err); c = clCreateBuffer(context, CL_MEM_WRITE_ONLY, sizeof(float) * LENGTH, NULL, &err); err = clEnqueueWriteBuffer(queue, a, CL_TRUE, 0, sizeof(float) * LENGTH, A, 0, NULL, NULL); err = clEnqueueWriteBuffer(queue, b, CL_TRUE, 0, sizeof(float) * LENGTH, B, 0, NULL, NULL); // 设定内核参数 err = clSetKernelArg(kernel, 0, sizeof(cl_mem), &a); err = clSetKernelArg(kernel, 1, sizeof(cl_mem), &b); err = clSetKernelArg(kernel, 2, sizeof(cl_mem), &c); // 执行内核 size_t globalSize = LENGTH; size_t localSize = 64; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &globalSize, &localSize, 0, NULL, NULL); // 读取结果 err = clEnqueueReadBuffer(queue, c, CL_TRUE, 0, sizeof(float) * LENGTH, C, 0, NULL, NULL); // 打印结果 for (i = 0; i < LENGTH; i++) { printf("%f + %f = %f\n", A[i], B[i], C[i]); } // 释放内存和资源 free(A); free(B); free(C); clReleaseMemObject(a); clReleaseMemObject(b); clReleaseMemObject(c); clReleaseKernel(kernel); clReleaseProgram(program); clReleaseCommandQueue(queue); clReleaseContext(context); return 0; } ``` 这个程序的作用是将两个向量相加,并打印结果。程序首先初始化了三个数组 A, B, C,然后获取 OpenCL 平台和设备,创建上下文和命令队列,创建和编译内核程序,创建内核,创建和设置缓冲区,设定内核参数,执行内核,读取结果,打印结果,最后释放内存和资源。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值