如何使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

我是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_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 )))));