yum install kernel-xen xen xen-libs xen-devel
패키지를 찾을 수 없음
CentOS 6에서는 hypervisor로 kvm을 선택하고 있어서 OS설치후 Xen Hypervisor를 따로 설치해 주어야 합니다.
CentOS 6.x를 최소설치 모드(minimal)로 설치 합니다.
※ Xen 설치시 kvm과 충돌나는 문제로 고민 하기 싫으면 반드시 minimal로 설치 하기를 권장함.
__kernel void vecAdd(__global int *a, __global int
*b, __global int *c) {
int id
= get_global_id(0);
c[id] =
a[id] + b[id];
}
|
#include "stdafx.h"
#include
#include
#include
#define MEM_SIZE 128
#define MAX_SOURCE_SIZE 0x100000
int _tmain(int argc, _TCHAR* argv[])
{
// 변수 선언
cl_platform_id platform_id;
cl_uint ret_num_platforms;
cl_device_id device_id;
cl_uint ret_num_devices;
cl_context context;
cl_command_queue command_queue;
cl_mem memA;
cl_mem memB;
cl_mem memC;
char *source_str;
size_t source_size;
FILE *fp;
char filename[]="./sample.cl";
cl_program program;
cl_kernel kernel;
cl_int ret;
cl_int err;
size_t size;
int a[MEM_SIZE];
int b[MEM_SIZE];
int c[MEM_SIZE];
// Platform ID 얻기
ret =
clGetPlatformIDs(1, &platform_id, &ret_num_platforms);
// Divice ID 얻기
ret =
clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_DEFAULT, 1, &device_id,
&ret_num_devices);
// Context 생성. context는 Device 리소스를
관리함.
context =
clCreateContext(NULL, 1, &device_id, NULL, NULL, &ret);
// Command Queue 생성. Command Queue를 통해
Device에 작업 시킴.
command_queue =
clCreateCommandQueue(context, device_id, 0, &ret);
// 계산할 변수에 값 할당
for (int i = 0; i
< MEM_SIZE; i++) {
a[i]
= i;
b[i]
= 4 * i;
}
// 계산에 사용되는 각 변수 메모리 할당
memA = clCreateBuffer(context,
CL_MEM_READ_WRITE, MEM_SIZE*sizeof(int), NULL, &ret);
memB =
clCreateBuffer(context, CL_MEM_READ_WRITE, MEM_SIZE*sizeof(int), NULL,
&ret);
memC =
clCreateBuffer(context, CL_MEM_READ_WRITE, MEM_SIZE*sizeof(int), NULL,
&ret);
// kernel에 입력해야하는 변수를 command queue에 할당
ret =
clEnqueueWriteBuffer(command_queue, memA, CL_TRUE, 0, MEM_SIZE*sizeof(int),
a, 0, NULL, NULL);
ret =
clEnqueueWriteBuffer(command_queue, memB, CL_TRUE, 0, MEM_SIZE*sizeof(int),
b, 0, NULL, NULL);
// kernel 함수 파일 읽어오기
fp =
fopen(filename, "r");
if (!fp) {
printf("Not
Kernel File. \n");
exit(1);
}
source_str =
(char*)malloc(MAX_SOURCE_SIZE * sizeof(char)) ;
source_size =
fread(source_str, 1, MAX_SOURCE_SIZE, fp);
fclose(fp);
// kernel 함수 string 으로 부터 program
생성
program =
clCreateProgramWithSource(context, 1, (const char**)&source_str, (const
size_t*)&source_size, &ret);
// program 빌드
ret =
clBuildProgram(program, 1, &device_id, NULL, NULL, NULL);
// kernel 생성. 두번째 param에 kernel 함수명을 정확기 기입하여야함.
kernel =
clCreateKernel(program, "sample", &ret);
// kernel 함수 param 지정
ret =
clSetKernelArg(kernel, 0, sizeof(cl_mem), (void*)&memA);
ret =
clSetKernelArg(kernel, 1, sizeof(cl_mem), (void*)&memB);
ret =
clSetKernelArg(kernel, 2, sizeof(cl_mem), (void*)&memC);
// global item 수 설정. 128번의 연산을 수행할 것이므로 128 설정.
size_t
global_item_size = 128;
// work_group 수 설정. global item 수에따른
work_group 분류로 global item 수에 나누어 떨어지는 수가 되어야함.
size_t
local_item_size = 1;
// kernel을 queue 할당. 실제 계산
수행.
ret = clEnqueueNDRangeKernel(command_queue,
kernel, 1, NULL, &global_item_size, &local_item_size, 0, NULL, NULL);
// 결과값 읽어오기
ret =
clEnqueueReadBuffer(command_queue, memC, CL_TRUE, 0, MEM_SIZE*sizeof(int), c,
0, NULL, NULL);
// 결과값 출력
for (int i = 0; i
< MEM_SIZE; i++) {
if
(i%4 == 0 ) printf("\n");
printf("%d\t",
c[i]);
}
// 메모리 해제
ret =
clFlush(command_queue);
ret =
clFinish(command_queue);
ret =
clReleaseKernel(kernel);
ret =
clReleaseProgram(program);
ret =
clReleaseMemObject(memA);
ret =
clReleaseMemObject(memB);
ret =
clReleaseMemObject(memC);
ret =
clReleaseCommandQueue(command_queue);
ret =
clReleaseContext(context);
return 0;
}
|