如何使OpenCL程序运行于大数据集?
我是OpenCL的新手。我正在尝试在NVIDIA GPU上运行一个简单的矢量加法OpenCL程序 代码如下: OpenCL文件是:如何使OpenCL程序运行于大数据集?,opencl,Opencl,我是OpenCL的新手。我正在尝试在NVIDIA GPU上运行一个简单的矢量加法OpenCL程序 代码如下: OpenCL文件是: #define MAX_SOURCE_SIZE (0x10000) #include<stdio.h> #include<stdlib.h> #include "CL/cl.h" int main() { cl_uint ret_num_platforms; cl_uint ret_num_devices; cl_plat
#define MAX_SOURCE_SIZE (0x10000)
#include<stdio.h>
#include<stdlib.h>
#include "CL/cl.h"
int main()
{
cl_uint ret_num_platforms;
cl_uint ret_num_devices;
cl_platform_id platform_id = NULL;
cl_kernel kernel2 = NULL;
cl_program program2 = NULL;
cl_command_queue command_queue = NULL;
cl_context context = NULL;
cl_device_id device_id = NULL;
cl_int ret;
FILE * fp2;
char fileName2[]="./kernel.cl";
int for_var=0;
char * source_str2;
size_t source_size2;
size_t globalWorkSize[1];
size_t localWorkSize[1];
cl_mem cl_buffer3;
cl_mem cl_buffer2;
cl_mem cl_buffer1;
cl_mem cl_buffer0;
int *A;
int *B;
int *C;
int *n;
int i;
n = ((int *)(malloc((sizeof(int )))));
printf("Enter the number of elements of vector : \n");
scanf("%d",n);
A = ((int *)(malloc((( *n) * sizeof(int )))));
B = ((int *)(malloc((( *n) * sizeof(int )))));
C = ((int *)(malloc((( *n) * sizeof(int )))));
printf("\nInput Vector1 :\n");
for (i = 0; i <= *n - 1; i += 1) {
A[i] = (2 * i);
printf("%d ",A[i]);
}
printf("\n\nInput Vector2 :\n");
for (i = 0; i <= *n - 1; i += 1) {
B[i] = (3 * i);
printf("%d ",B[i]);
}
ret = clGetPlatformIDs(1,&platform_id,&ret_num_platforms);
if (ret != CL_SUCCESS) {
printf("Platform error");
}
ret = clGetDeviceIDs(platform_id,CL_DEVICE_TYPE_DEFAULT,1,&device_id,&ret_num_devices);
if (ret != CL_SUCCESS)
printf("device err");
context=clCreateContext(NULL,1,&device_id,NULL,NULL,&ret);
if (!context)
printf("context err");
command_queue = clCreateCommandQueue(context,device_id,0,&ret);
if (!command_queue)
printf("command queue error");
localWorkSize[0] = 16;
globalWorkSize[0] =16400;
cl_buffer0=clCreateBuffer(context, CL_MEM_WRITE_ONLY, (*n) * sizeof(int), NULL, &ret);
cl_buffer1=clCreateBuffer(context, CL_MEM_WRITE_ONLY, (*n) * sizeof(int), NULL, &ret);
cl_buffer3=clCreateBuffer(context, CL_MEM_WRITE_ONLY, sizeof(int), NULL, &ret);
cl_buffer2=clCreateBuffer(context, CL_MEM_READ_WRITE, (*n) * sizeof(int), NULL, &ret);
ret = clEnqueueWriteBuffer(command_queue, cl_buffer0 , CL_TRUE, 0,(*n) * sizeof(int), A, 0, NULL, NULL);
ret = clEnqueueWriteBuffer(command_queue, cl_buffer1 , CL_TRUE, 0,(*n) * sizeof(int), B, 0, NULL, NULL);
ret = clEnqueueWriteBuffer(command_queue, cl_buffer3 , CL_TRUE, 0, sizeof(int), n, 0, NULL, NULL);
ret = clEnqueueWriteBuffer(command_queue, cl_buffer2 , CL_TRUE, 0,(*n) * sizeof(int), C, 0, NULL, NULL);
fp2 = fopen(fileName2,"r");
if (!fp2) {
fprintf(stderr,"Failed");
exit(1);
}
source_str2 = (char*)malloc(MAX_SOURCE_SIZE);
source_size2 = fread(source_str2,1,MAX_SOURCE_SIZE,fp2);
fclose(fp2);
program2 = clCreateProgramWithSource(context, 1, (const char **)&source_str2,(const size_t *)&source_size2, &ret);
if(!program2)
printf("error creating program2");
ret = clBuildProgram(program2, 1, &device_id, NULL, NULL, NULL);
if (ret)
printf("error building program2");
kernel2 = clCreateKernel(program2, "ADD" , &ret);
ret = clSetKernelArg(kernel2, 0, sizeof(cl_mem), &cl_buffer0);
ret = clSetKernelArg(kernel2, 1, sizeof(cl_mem), &cl_buffer1);
ret = clSetKernelArg(kernel2, 2, sizeof(cl_mem), &cl_buffer2);
ret = clSetKernelArg(kernel2, 3, sizeof(cl_mem), &cl_buffer3);
ret = clEnqueueNDRangeKernel(command_queue, kernel2, 1, NULL, globalWorkSize, localWorkSize, 0 , NULL , NULL);
ret = clEnqueueReadBuffer(command_queue, cl_buffer2 , CL_TRUE, 0,(*n) * sizeof(int), C, 0, NULL, NULL);
printf("\n\nAddition of vectors :\n");
for (i = 0; i <= *n - 1; i += 1) {
printf("%d ",C[i]);
}
clReleaseMemObject(cl_buffer0);
clReleaseMemObject(cl_buffer1);
clReleaseMemObject(cl_buffer2);
clReleaseMemObject(cl_buffer3);
clReleaseCommandQueue(command_queue);
clReleaseContext(context);
return 0;
}
#定义最大源大小(0x10000)
#包括
#包括
#包括“CL/CL.h”
int main()
{
cl_uint ret_num_平台;
氯离子交换装置;
cl_平台_id平台_id=NULL;
cl_kernel2=NULL;
cl_程序程序2=空;
cl_命令_队列命令_队列=NULL;
cl_上下文=空;
cl\U设备\U id设备\U id=NULL;
cl_int ret;
文件*fp2;
char fileName2[]=“/kernel.cl”;
int表示_var=0;
字符*source_str2;
尺寸来源尺寸2;
大小\u t全局工作大小[1];
大小\u t本地工作大小[1];
cl_mem cl_buffer3;
cl_mem cl_buffer2;
cl_mem cl_buffer1;
cl_mem cl_buffer0;
int*A;
int*B;
int*C;
int*n;
int i;
n=((int*)(malloc((sizeof(int)щщ)));
printf(“输入向量的元素数:\n”);
scanf(“%d”,n);
A=((int*)(malloc((*n)*sizeof(intЮЮ));
B=((int*)(malloc((*n)*sizeof(intЮЮ));
C=((int*)(malloc((*n)*sizeof(intЮЮ));
printf(“\n输入向量1:\n”);
对于(i=0;i您的代码中至少有一个错误-您正在将MEM_SIZE*sizeof(int)
字节从n
复制到缓冲区3:
ret = clEnqueueWriteBuffer(command_queue, cl_buffer3 , CL_TRUE, 0,MEM_SIZE * sizeof(int), n, 0, NULL, NULL);
但是,n
只有sizeof(int)
字节长:
n = ((int *)(malloc((sizeof(int )))));
我不知道这可能会导致什么问题,完全可能还有其他更严重的错误,但这一个肯定没有帮助。您可以使用查询设备的最大本地和全局工作大小来查询CL\u设备\u最大工作\u组大小和CL\u设备\u最大工作\u项目大小设备信息属性RTIE.16和1024通常不应该是问题。如果你的程序挂起,你的代码中可能有其他错误。如果你需要帮助诊断问题,你需要发布一些代码。我正在NVIDIA Tesla M2050上运行此程序。这里,CL_DEVICE_MAX_WORK_GROUP_SIZE给出1024,0,0,CL_DEVICE_MAX_WORK_ITEM_SIZE给出10241024,64Thanks@pmdj。我已经更新了代码。请看一下。
n = ((int *)(malloc((sizeof(int )))));