详细程序注解学OpenCL一 环境配置和入门程序

OpenCL中kernel设置的序号关系 发起kernel运算的API: cl_int enqueueNDRangeKernel( const Kernel& kernel, const NDRange& offset, const NDRange& global, const NDRange& local = NullRange, const VECTOR_CLASS<Event>* events = NULL, Event* event = NULL) 我们会设置数据数组的核心参数: 阅读详情

本专栏是通过注解程序的方法学习OpenCL,我觉得一个一个地去抠原理也不是办法,干脆直接学习程序,然后把相关原理都直接注解到程序语句当中。

原创地址:http://blog.youkuaiyun.com/kenden23/article/details/14101657

一开始要配置好环境,我的是nvidia,所以就按照我的电脑举例,AMD应该也差不多。

1. 首先要到nvidia网站下载适合你显卡的最新驱动,安装好

2. 还是在nvidia网站下载好CUDA开发包,安装好

3. 如果默认安装路径的话,路径应该是在:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0

4. 打开这个目录会发现里面有include和lib文件夹,这就是我们需要配置在visual studio中的文件

5. 打开visual studio(版本基本都无关系,我用的是vs2012),新建一个win32空项目。按下alt+F7打开项目属性,也可以点击项目文件右键,选择属性。

6. 在属性页里面找到“C/C++”的“常规”项,点击,右边有“附加包含目录”,然后编辑,添加目录:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\include

7.在属性页里面找到“连接器”,点击其“常规”项,右边有“附加库目录”,然后也是编辑,添加目录:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\lib\Win32,如果是64位系统可以是:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\lib\x64。

8. 在属性页里找到“常规”项, 右边“附加依赖项”,编辑,添加lib文件:OpenCL.lib

9. 然后就可以新建源文件,在源文件里面添加相关的OpenCl程序,就可以调试OpenCL程序了。

下面就可以开始学习程序了。

下面是个入门程序,已经注释好了,注释包括了基本原理的解析,可以通过直接阅读和调试程序学习OpenCL了。

本程序是读取电脑中的支持OpenCL的硬件nvidia和intel和AMD等信息,然后显示在屏幕上。

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4. #include <iostream>  
  5.   
  6. #ifdef MAC  
  7. #include <OpenCL/cl.h>  
  8. #else  
  9. #include <CL/cl.h>  
  10. #endif  
  11.   
  12. int main() {  
  13.   
  14.     /* Host data structures */  
  15.     cl_platform_id *platforms;  
  16.     //每一个cl_platform_id 结构表示一个在主机上的OpenCL执行平台,就是指电脑中支持OpenCL的硬件,如nvidia显卡,intel CPU和显卡,AMD显卡和CPU等  
  17.     cl_uint num_platforms;  
  18.     cl_int i, err, platform_index = -1;  
  19.   
  20.     /* Extension data */  
  21.     char* ext_data;                           
  22.     size_t ext_size;     
  23.     const char icd_ext[] = "cl_khr_icd";  
  24.   
  25.     //要使platform工作,需要两个步骤。1 需要为cl_platform_id结构分配内存空间。2 需要调用clGetPlatformIDs初始化这些数据结构。一般还需要步骤0:询问主机上有多少platforms  
  26.   
  27.     /* Find number of platforms */  
  28.     //返回值如果为-1就说明调用函数失败,如果为0标明成功  
  29.     //第二个参数为NULL代表要咨询主机上有多少个platform,并使用num_platforms取得实际flatform数量。  
  30.     //第一个参数为1,代表我们需要取最多1个platform。可以改为任意大如:INT_MAX整数最大值。但是据说0,否则会报错,实际测试好像不会报错。下面是步骤0:询问主机有多少platforms  
  31.     err = clGetPlatformIDs(5, NULL, &num_platforms);          
  32.     if(err < 0) {          
  33.         perror("Couldn't find any platforms.");           
  34.         exit(1);                              
  35.     }                                     
  36.   
  37.     printf("I have platforms: %d\n", num_platforms); //本人计算机上显示为2,有intel和nvidia两个平台  
  38.   
  39.     /* Access all installed platforms */  
  40.     //步骤1 创建cl_platform_id,并分配空间  
  41.     platforms = (cl_platform_id*)                     
  42.         malloc(sizeof(cl_platform_id) * num_platforms);   
  43.     //步骤2 第二个参数用指针platforms存储platform  
  44.     clGetPlatformIDs(num_platforms, platforms, NULL);         
  45.   
  46.     /* Find extensions of all platforms */  
  47.     //获取额外的平台信息。上面已经取得了平台id了,那么就可以进一步获取更加详细的信息了。  
  48.     //一个for循环获取所有的主机上的platforms信息  
  49.     for(i=0; i<num_platforms; i++)   
  50.     {  
  51.         /* Find size of extension data */  
  52.         //也是和前面一样,先设置第三和第四个参数为0和NULL,然后就可以用第五个参数ext_size获取额外信息的长度了。  
  53.         err = clGetPlatformInfo(platforms[i],             
  54.             CL_PLATFORM_EXTENSIONS, 0, NULL, &ext_size);      
  55.         if(err < 0)   
  56.         {  
  57.             perror("Couldn't read extension data.");              
  58.             exit(1);  
  59.         }     
  60.   
  61.         printf("The size of extension data is: %d\n", ext_size);//我的计算机显示224.  
  62.   
  63.         /* Access extension data */    
  64.         //这里的ext_data相当于一个缓存,存储相关信息。  
  65.         ext_data = (char*)malloc(ext_size);   
  66.         //这个函数就是获取相关信息的函数,第二个参数指明了需要什么样的信息,如这里的CL_PLATFORM_EXTENSIONS表示是opencl支持的扩展功能信息。我计算机输出一大串,机器比较新(专门为了学图形学而购置的电脑),支持的东西比较多。  
  67.         clGetPlatformInfo(platforms[i], CL_PLATFORM_EXTENSIONS,       
  68.             ext_size, ext_data, NULL);                
  69.         printf("Platform %d supports extensions: %s\n", i, ext_data);  
  70.   
  71.         //这里是输出生产商的名字,比如我显卡信息是:NVIDIA CUDA  
  72.         char *name = (char*)malloc(ext_size);  
  73.         clGetPlatformInfo(platforms[i], CL_PLATFORM_NAME,     
  74.             ext_size, name, NULL);                
  75.         printf("Platform %d name: %s\n", i, name);  
  76.   
  77.         //这里是供应商信息,我显卡信息:NVIDIA Corporation  
  78.         char *vendor = (char*)malloc(ext_size);  
  79.         clGetPlatformInfo(platforms[i], CL_PLATFORM_VENDOR,       
  80.             ext_size, vendor, NULL);                  
  81.         printf("Platform %d vendor: %s\n", i, vendor);  
  82.   
  83.         //最高支持的OpenCL版本,本机显示:OpenCL1.1 CUDA 4.2.1  
  84.         char *version = (char*)malloc(ext_size);  
  85.         clGetPlatformInfo(platforms[i], CL_PLATFORM_VERSION,      
  86.             ext_size, version, NULL);                 
  87.         printf("Platform %d version: %s\n", i, version);  
  88.   
  89.         //这个只有两个值:full profile 和 embeded profile  
  90.         char *profile = (char*)malloc(ext_size);  
  91.         clGetPlatformInfo(platforms[i], CL_PLATFORM_PROFILE,      
  92.             ext_size, profile, NULL);                 
  93.         printf("Platform %d full profile or embeded profile?: %s\n", i, profile);  
  94.   
  95.         /* Look for ICD extension */     
  96.         //如果支持ICD这一扩展功能的platform,输出显示,本机的Intel和Nvidia都支持这一扩展功能  
  97.         if(strstr(ext_data, icd_ext) != NULL)   
  98.             platform_index = i;  
  99.         std::cout<<"Platform_index = "<<platform_index<<std::endl;  
  100.         /* Display whether ICD extension is supported */  
  101.         if(platform_index > -1)  
  102.             printf("Platform %d supports the %s extension.\n",   
  103.             platform_index, icd_ext);  
  104.   
  105.         std::cout<<std::endl;  
  106.   
  107.         //释放空间  
  108.         free(ext_data);  
  109.         free(name);  
  110.         free(vendor);  
  111.         free(version);  
  112.         free(profile);  
  113.     }  
  114.           
  115.     if(platform_index <= -1)  
  116.         printf("No platforms support the %s extension.\n", icd_ext);  
  117.   
  118.     /* Deallocate resources */  
  119.     free(platforms);  
  120.     return 0;  
  121. }   


每个电脑的输出结果不一样的,我电脑的输出结果是:


OpenCL 查看设备信息

下面是注释程序,目的就是查看自己计算机上所有支持OpenCL的设备,并打印信息。

主函数调用run()就可以运行了。要设置请看我另一篇OpenCl设置文章。

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4.   
  5. #ifdef MAC  
  6. #include <OpenCL/cl.h>  
  7. #else  
  8. #include <CL/cl.h>  
  9. #endif  
  10.   
  11. namespace device_ext_test  
  12. {  
  13.   
  14. int run() {  
  15.     /* Host/device data structures */  
  16.     cl_platform_id *platforms;  
  17.     cl_device_id *devices;  
  18.     cl_uint num_platforms;  
  19.     cl_uint num_devices, addr_data;  
  20.     cl_int i, err;  
  21.   
  22.     /* Extension data */  
  23.     char name_data[48], ext_data[4096];  
  24.   
  25.     err = clGetPlatformIDs(5, NULL, &num_platforms);          
  26.     if(err < 0) {          
  27.         perror("Couldn't find any platforms.");           
  28.         exit(1);                              
  29.     }  
  30.   
  31.     /* 选取所有的platforms*/  
  32.     platforms = (cl_platform_id*)                     
  33.         malloc(sizeof(cl_platform_id) * num_platforms);  
  34.     err = clGetPlatformIDs(num_platforms, platforms, NULL);           
  35.     if(err < 0) {              
  36.         perror("Couldn't find any platforms");  
  37.         exit(1);  
  38.     }  
  39.       
  40.     //循环查看所有platforms的devices信息,一般intel和AMD的都可以有两个devices:CPU和显卡  
  41.     //如果是nvidia的就一般只有一个显卡device了。  
  42.     for (int j = 0; j < (int)num_platforms; j++)  
  43.     {  
  44.         printf("\nplatform %d\n", j+1);  
  45.         /* 步骤和platforms的一样 */  
  46.         err = clGetDeviceIDs(platforms[j], CL_DEVICE_TYPE_ALL, 1, NULL, &num_devices);  
  47.         if(err < 0) {                  
  48.             perror("Couldn't find any devices");  
  49.             exit(1);  
  50.         }  
  51.   
  52.         /* Access connected devices */  
  53.         devices = (cl_device_id*)                     
  54.             malloc(sizeof(cl_device_id) * num_devices);       
  55.         clGetDeviceIDs(platforms[j], CL_DEVICE_TYPE_ALL,              
  56.             num_devices, devices, NULL);                  
  57.   
  58.         /*循环显示platform的所有device(CPU和显卡)信息。*/  
  59.         for(i=0; i<(int)num_devices; i++) {  
  60.   
  61.             err = clGetDeviceInfo(devices[i], CL_DEVICE_NAME,         
  62.                 sizeof(name_data), name_data, NULL);              
  63.             if(err < 0) {          
  64.                 perror("Couldn't read extension data");  
  65.                 exit(1);  
  66.             }  
  67.             clGetDeviceInfo(devices[i], CL_DEVICE_ADDRESS_BITS,       
  68.                 sizeof(ext_data), &addr_data, NULL);              
  69.   
  70.             clGetDeviceInfo(devices[i], CL_DEVICE_EXTENSIONS,         
  71.                 sizeof(ext_data), ext_data, NULL);            
  72.   
  73.             printf("NAME: %s\nADDRESS_WIDTH: %u\nEXTENSIONS: %s\n\n",   
  74.                 name_data, addr_data, ext_data);  
  75.         }  
  76.     }  
  77.   
  78.     free(platforms);  
  79.     free(devices);  
  80.     printf("\n");  
  81.     system("pause");  
  82.     return 0;  
  83. }  
  84.   
  85.   
  86. }  



OpenCL 操作context

本程序主要测试:

context = clCreateContext(NULL, 1, &device, NULL, NULL, &err);

创建一个context

clRetainContext(context);//Context的reference +1

clReleaseContext(context);//Context的reference -1


  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4.   
  5. #ifdef MAC  
  6. #include <OpenCL/cl.h>  
  7. #else  
  8. #include <CL/cl.h>  
  9. #endif  
  10.   
  11. namespace context_count  
  12. {  
  13.   
  14. int run()   
  15. {  
  16.     cl_platform_id platform;  
  17.     cl_device_id device;  
  18.     cl_context context;  
  19.     cl_int err;  
  20.     cl_uint ref_count;  
  21.   
  22.     err = clGetPlatformIDs(1, &platform, NULL);  
  23.     if(err < 0) {  
  24.         perror("Couldn't find any platforms");  
  25.         exit(1);  
  26.     }  
  27.   
  28.     err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device, NULL);  
  29.     if(err == CL_DEVICE_NOT_FOUND) {  
  30.         err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_CPU, 1, &device, NULL);  
  31.     }  
  32.     if(err < 0) {  
  33.         perror("Couldn't find any devices");  
  34.         exit(1);  
  35.     }  
  36.   
  37.     /* 创建 context */  
  38.     context = clCreateContext(NULL, 1, &device, NULL, NULL, &err);  
  39.     if(err < 0) {  
  40.         perror("Couldn't create a context");  
  41.         exit(1);     
  42.     }  
  43.   
  44.     /* 获取reference count的数量,使用ref_count返回值*/  
  45.     err = clGetContextInfo(context, CL_CONTEXT_REFERENCE_COUNT,       
  46.         sizeof(ref_count), &ref_count, NULL);             
  47.     if(err < 0) {          
  48.         perror("Couldn't read the reference count.");  
  49.         exit(1);  
  50.     }  
  51.     printf("Initial reference count: %u\n", ref_count);  
  52.   
  53.     /* 每次函数访问context的时候,调用clRetainContext,就是把context reference + 1,因为context并不是像platform和device那样delete的,而是clRetainContext的时候+1,当调用clReleaseContext的时候-1,当为零的时候,系统自动删除context。这就可以方便cl_context数据存活超过创建它的函数,可以让第三方库什么的继续访问context */  
  54.     clRetainContext(context);clRetainContext(context);                        
  55.     clGetContextInfo(context, CL_CONTEXT_REFERENCE_COUNT,         
  56.         sizeof(ref_count), &ref_count, NULL);             
  57.     printf("Reference count: %u\n", ref_count);           
  58.   
  59.     clReleaseContext(context);                        
  60.     clGetContextInfo(context, CL_CONTEXT_REFERENCE_COUNT,         
  61.         sizeof(ref_count), &ref_count, NULL);             
  62.     printf("Reference count: %u\n", ref_count);           
  63.   
  64.     clReleaseContext(context);clReleaseContext(context);      
  65.     system("pause");  
  66.     return 0;  
  67. }  
  68.   
  69. }  



OpenCL 获取Program信息

本程序生成一个OpenCL Program,然后获取Program的source,其实它的source就是一个char[],可以打印出来。

然后我们把这些内容和原来文本的内容对比,看看是否是我们想要读入的内容。

还可以测试是否编译正确,如果不正确会有输出提示的。


下面程序运行如下:



前面都是读入的函数代码。然后后面检查这些函数是否正确,可以看到第二个函数不正确,因为*r没有定义。


下面是完整代码:

  1. #define _CRT_SECURE_NO_WARNINGS  
  2.   
  3. #include <stdio.h>  
  4. #include <stdlib.h>  
  5. #include <sys/types.h>  
  6.   
  7. #ifdef MAC  
  8. #include <OpenCL/cl.h>  
  9. #else  
  10. #include <CL/cl.h>  
  11. #endif  
  12.   
  13. namespace program_build  
  14. {  
  15.   
  16. const static int NUM_FILES = 2;  
  17. const char PROGRAM_FILE_1[] = "good.cl";  
  18. const char *PROGRAM_FILE_2 = "bad.cl";  
  19.   
  20. int run()  
  21. {  
  22.     /*program可以包括多个kernel,一个kernel相当于一个功能函数,由program包含在内存中,然后就可以使用kernel的功能了。 
  23.     1 需要使用kernel,创建program,把kernel读入内存 
  24.     2 需要把program和device连接起来 
  25.      Host/device data structures */  
  26.     cl_platform_id platform;  
  27.     cl_device_id device;  
  28.     cl_context context;  
  29.     cl_int i, err;  
  30.   
  31.     /* Program data structures */  
  32.     cl_program program;  
  33.     FILE *program_handle;  
  34.     char *program_buffer[NUM_FILES];  
  35.     char *program_log;  
  36.     const char *file_name[] = {PROGRAM_FILE_1, PROGRAM_FILE_2};  
  37.     const char options[] = "-cl-finite-math-only -cl-no-signed-zeros";    
  38.     size_t program_size[NUM_FILES];  
  39.     size_t log_size;  
  40.   
  41.     /* Access the first installed platform */  
  42.     err = clGetPlatformIDs(1, &platform, NULL);  
  43.     if(err < 0) {  
  44.         perror("Couldn't find any platforms");  
  45.         exit(1);  
  46.     }  
  47.   
  48.     /* Access the first GPU/CPU */  
  49.     err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device, NULL);  
  50.     if(err == CL_DEVICE_NOT_FOUND) {  
  51.         err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_CPU, 1, &device, NULL);  
  52.     }  
  53.     if(err < 0) {  
  54.         perror("Couldn't find any devices");  
  55.         exit(1);  
  56.     }  
  57.   
  58.     /* Create a context */  
  59.     context = clCreateContext(NULL, 1, &device, NULL, NULL, &err);  
  60.     if(err < 0) {  
  61.         perror("Couldn't create a context");  
  62.         exit(1);     
  63.     }  
  64.   
  65.     /* Read each program file and place content into buffer array */  
  66.     for(i=0; i<NUM_FILES; i++) {  
  67.   
  68.         program_handle = fopen(file_name[i], "r");  
  69.         if(program_handle == NULL) {  
  70.             perror("Couldn't find the program file");  
  71.             exit(1);     
  72.         }  
  73.         fseek(program_handle, 0, SEEK_END);  
  74.         program_size[i] = ftell(program_handle);  
  75.         rewind(program_handle);  
  76.         program_buffer[i] = (char*)malloc(program_size[i]+1);  
  77.         program_buffer[i][program_size[i]] = '\0';  
  78.         fread(program_buffer[i], sizeof(char), program_size[i],   
  79.             program_handle);  
  80.         fclose(program_handle);  
  81.     }  
  82.   
  83.     /* Create a program containing all program content */  
  84.     program = clCreateProgramWithSource(context, NUM_FILES,               
  85.         (const char**)program_buffer, program_size, &err);                
  86.     if(err < 0) {  
  87.         perror("Couldn't create the program");  
  88.         exit(1);     
  89.     }  
  90.   
  91.     /* Build program 
  92.     but one provision is crucial: every compiler must be accessible through clBuild-Program. This function compiles and links a cl_program for devices associated with the platform. It doesn’t return a new cl_program, but instead modifies the input data structure. 
  93.     */  
  94.   
  95.     err = clBuildProgram(program, 1, &device, options, NULL, NULL);   
  96.   
  97.     int bufSize = program_size[0] + program_size[1] + 1;  
  98.     char *programBuffer = (char *) malloc(bufSize);  
  99.     clGetProgramInfo(program, CL_PROGRAM_SOURCE, bufSize, programBuffer, NULL);  
  100.     printf("Print Program Source:\n");  
  101.     printf("\n %s \n", programBuffer);   
  102.   
  103.     printf("Check if it is correct:\n");  
  104.     for (int i = 0; i < NUM_FILES; i++)  
  105.     {  
  106.         printf("\n %s \n", program_buffer[i]);  
  107.     }  
  108.   
  109.     if(err < 0)   
  110.     {  
  111.         clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_LOG,   
  112.             0, NULL, &log_size);  
  113.         program_log = (char*) malloc(log_size+1);  
  114.         program_log[log_size] = '\0';  
  115.         clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_LOG,   
  116.             log_size+1, program_log, NULL);  
  117.         printf("%s\n", program_log);  
  118.         free(program_log);  
  119.         system("pause");  
  120.         exit(1);  
  121.     }  
  122.   
  123.     /* Deallocate resources */  
  124.     for(i=0; i<NUM_FILES; i++) {  
  125.         free(program_buffer[i]);  
  126.     }  
  127.     clReleaseProgram(program);  
  128.     clReleaseContext(context);  
  129.     system("pause");  
  130.   
  131.     return 0;  
  132. }  
  133.   
  134. } 



VOLT开源GPU编译器:SIMT架构优化与RISC-V支持 GPU编译器是现代异构计算的关键技术,其核心挑战在于高效处理SIMT(单指令多线程)架构下的线程控制流分歧。与传统CPU编译器不同,GPU编译器需要解决线程束(warp)内执行路径不一致带来的性能损失问题。通过中间表示(IR)优化和LLVM后端扩展,开源项目VOLT为RISC-V GPU提供了完整的编译工具链支持。该技术采用控制流图(CFG)结构化、分歧检测与线程掩码管理等创新方法,在Rodinia基准测试中显著提升了40-60%的性能。这类优化技术广泛应用于深度学习框架、科学计算等需要大规模并行计算的场景 阅读详情

相关推荐

28、多核处理器与GPU利用优化:OMPSs的表现与潜力

本文探讨了OMPSs在多核处理器和GPU编程中的表现与潜力。通过对比OpenCL、CUDA等现有环境,展示了OMPSs在性能和生产力方面的显著优势,并介绍了其在不同硬件架构下的评估结果。此外,还展望了未来OMPSs的改进方向,包括任务调度优化、数据传输调整和大型应用移植。

r7s8t的博客 78

get_global_size - get_global_id - get_local_size - get_local_id - get_num_groups - get_group_id

OpenCL Work-Item Functions (工作项函数) - get_work_dim - get_global_size - get_global_id - get_local_size - get_local_id - get_num_groups - get_group_id - get_global_offset

程永强 3473

OpenCL中文入门完整教程

这个教程是引导我opencl入门的教程,挺有帮助的。介绍了opencl内存对象,kernel编写,GPU架构,线程调度,性能优化,都有具体例子。

opencl学习(一)

细分了流程,并注释了相应函数 对get_global_id的理解:如果clEnqueueNDRangeKernel设置的是一维且global_item_size = 9,那么get_global_id(0)返回0到8,对应9个work-group。如果clEnqueueNDRangeKernel设置的是二维且global_item_size[2] = {9, 8},那么get_global_id(0)和get_global_id(1)的结果是(0,j)(1,j)(2,j)(3,j)(4,j)(5,j)(6.

random_repick的专栏 3692

AI应用架构师:引领半导体良率AI预测的变革浪潮

在半导体行业这个技术密集、资本密集且竞争异常激烈的领域,良率是决定企业盈利能力的关键指标。每提升1%的良率可能意味着数亿美元的利润增长。然而,随着制程节点不断缩小至3nm、2nm甚至更先进水平,传统的良率管理方法已难以应对日益复杂的制造流程和指数级增长的数据量。本文将深入探讨AI应用架构师如何成为这场变革的核心驱动力,通过设计和实施先进的AI预测系统,将半导体良率预测从传统的"事后分析"转变为"事前预测"和"实时优化"。

AI大模型应用之禅 403

IAR9.4报错之编码方式

IAR9.40编码方式错误导致的报错

qq_36081075的博客 2626

OpenCL 教学(一)

Contents OpenCL简介 OpenCL的架构 OpenCL环境设定 开始撰写OpenCL程式 建立Command Queue 产生资料 配置记忆体并复制资料 编译OpenCL kernel程式 执行OpenCL kernel penCL 简介 OpenCL是由Khronos Group针对异质性计算装置(heterogeneous device)进行平行化运...

weixin_34008805的博客 254

【Codex Sandbox 与审批机制:小白也能看懂的实用教程】

这篇教程介绍了Codex工具中的沙盒(Sandbox)和审批(Approvals)机制,帮助用户安全高效地使用Codex协作。沙盒限制Codex访问范围,审批机制则控制敏感操作权限。文章详细讲解了五种常见模式:最安全的安全只读浏览、只读非交互、仓库内编辑、Auto预设和不推荐的YOLO模式。还提供了新手使用路径建议、配置示例和实战场景范式,包括如何测试沙盒行为、不同系统下的实现方式以及常见问题解答。最后附上速查清单,帮助用户快速选择合适的权限组合。

zsr154278963的博客 6706

opencl开发环境配置

opencl

u012361418的博客 2182

用友U8其中一个账套提示演示期已到期-修复方法

【事件始末】 一朋友求助,反馈使用的用友U8,很多年了! 突然发现其中账套2021年的一个账套打不开,提示演示期限已到期! 但是其他账套完全正常,可以打开,没有任何问题。 不管是还原老旧备份,还是重装软件问题依旧,无法自己解决。 客户查询报表结算账期,情况比较紧急,于是求助我们。 经过多次反复琢磨和烟酒,终于于晚上23点59分给弄了出来,也总是圆满解决问题了。 【问题分析】 该用户打的是 U82X免狗补丁,估计是该补丁文件设置了 最大有效期,补丁到期了导致的。 也有可能是程序...

u010431289的博客 2万+

基于CUDA的OpenCL开发环境搭建与入门程序示例

参考资料:《详细程序注解学OpenCL一 环境配置和入门程序》、《VS2010 NVIDIA OpenCL 开发环境配置》 一、搭建开发环境 1. 下载和安装CUDA SDK   下载路径: https://developer.nvidia.com/cuda-downloads ;   如果默认安装路径的话,是在:C:\Program Files\NVIDIA GPU

Johnson的技术博客 7001

华为交换机、路由器配置静态路由实现不同网段通信

华为交换机、路由器配置静态路由实现不同网段通信。在主核心交换机上配置vlanif10 192.168.10.254/24,vlanif20 192.168.20.254/24,vlanif100 192.168.100.1/24,PC1:192.168.10.1能ping通PC2:192.168.20.1,也能ping通PC3:192.168.30.1,交换机和路由器使用静态路由。

星如雨落 6460

【异构计算平台系列 - GPU + OpenCL - 04】OpenCV与OpenCL的联合开发

在2011年,OpenCV-2.4.3版本中开始包含OCL模块,用于借助于OpenCL扩展部分API的GPU运算能力。 在2014年,OpenCV-3.x版本中使用T-API替代原有的OCL模块,通过OpenCL进行计算优化。 OpenCV-3.x版本的重大变化包括: 架构调整,采用“内核+插件”的架构形式替代原本的整体架构。(Base Class:Algorithm) 引入Transpa...

星辉领域 1117

YOLOv9电力巡检实战:绝缘子破裂/鸟巢识别+无人机自动定位

摘要:本文聚焦电力输电线路巡检的效率与安全痛点,提出基于YOLOv9与无人机的智能巡检解决方案。针对绝缘子破裂、鸟巢等高危缺陷,通过“无人机改装-模型训练-缺陷识别-工单生成”四阶段工程落地流程,实现全自动化巡检。系统采用大疆M300无人机搭载RTK模块与Jetson边缘计算盒,结合改进YOLOv9模型实时识别5类缺陷,通过4G传输将GPS定位与缺陷数据同步至工单系统。实测表明,该方案巡检效率达50公里/天(较人工提升10倍),缺陷发现率95%(提升40%),事故预防率98%。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1510

【LAMMPS学习】四、运行 LAMMPS(2)命令行选项

本部分解释了在安装可执行文件或下载源代码并构建可执行文件后如何运行 LAMMPS。命令文档页面描述了输入脚本的结构以及它们可以包含的命令。

荷塘阅色 5242

TornadoVM核心功能解析:OpenCL、PTX与SPIR-V后端如何加速Java应用

TornadoVM是一个实用高效的异构编程框架,专为托管语言设计,能让Java应用程序轻松利用GPU、FPGA等硬件加速器的计算能力。其核心优势在于通过OpenCL、PTX和SPIR-V三大后端,实现Java代码到异构设备的高效转换与执行,显著提升应用性能。 ## TornadoVM如何连接Java与异构硬件? TornadoVM作为桥梁,上接Java等多种编程语言,下连各类硬件加速器,构建起

gitblog_01180的博客 572

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

TornadoVM实战指南:高效Java异构计算的终极解决方案

TornadoVM是一个革命性的异构编程框架,专为Java开发者设计,能够将Java程序自动卸载到GPU、FPGA等异构硬件上运行。本文是面向有一定技术背景的开发者的实战指南,深入解析TornadoVM的核心原理、配置方法和性能优化策略,帮助你在异构计算领域实现10倍以上的性能提升。 ## 架构解析:多语言支持与硬件兼容性 TornadoVM的核心价值在于其独特的架构设计。作为OpenJDK和

gitblog_00687的博客 937

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

解密TornadoVM异构计算:7个实战技巧构建高效GPU加速应用

TornadoVM作为Java生态中的异构计算框架,能够让开发者轻松地将Java代码迁移到GPU、FPGA等加速设备上执行,实现显著的性能提升。本文将为中级开发者和技术决策者深入解析TornadoVM的核心架构,并提供7个实战优化技巧,帮助您构建高效的GPU加速应用。 ## 思维导图:TornadoVM核心架构解析 TornadoVM的成功在于其精心设计的架构,理解这一架构是优化应用性能的基础

gitblog_00349的博客 726

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

网易云、QQ音乐歌词获取工具:从一条链接到 LRC 文件只用 30 秒

给一段两分钟的视频配字幕,逐句拖动时间轴对齐到凌晨——如果你经历过,应该懂这种机械活有多磨人。其实带时间轴的歌词文件可以直接从音乐平台拿,对齐这一步可以整体省掉。 ## 工具名片:两分钟说清它能干什么 163MusicLyrics 是一款跨平台歌词获取工具,从网易云音乐和 QQ 音乐拉取官方时间轴歌词,存成 LRC 或 SRT。 | 项 | 内容 | | --- | --- | | 运行平台

gitblog_01175的博客 780

深入解析Squirrel状态机:从订单支付到分布式事务的实战应用

本文深入解析Squirrel状态机在订单支付和分布式事务中的实战应用。通过电商平台案例,详细介绍了状态机的核心概念、配置方法及高级功能,如状态持久化、分布式锁和事务管理。Squirrel状态机能有效管理复杂业务流转,提升系统可维护性和扩展性,特别适用于订单生命周期管理等场景。

weixin_30836759的博客 451

TornadoVM vs 传统Java:为什么异构编程框架是高性能计算的未来?

在数字化转型加速的今天,高性能计算已成为科研、金融和人工智能等领域的核心需求。传统Java虽然以跨平台性和稳定性著称,但在面对GPU、FPGA等异构硬件时往往力不从心。TornadoVM的出现,彻底改变了这一局面——作为一款面向托管语言的异构编程框架,它让Java开发者无需深入硬件细节,就能轻松释放GPU、CPU和FPGA的强大算力。本文将深入对比TornadoVM与传统Java的性能差异,揭示异

gitblog_00264的博客 618
上一篇: GPGPU OpenCL编程步骤与简单实例
下一篇: OpenCL2.0特性之SVM
凌风探梅
博客等级 码龄19年 2575粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值