Beispiel #1
0
int main()
{
    int t, n;
    seive(MAX_NUM);
    scanf("%d", &t);
    while (t--){
        scanf("%d", &n);
        printf("%d\n", euler_totient(n));
    }
    return 0;
}
int main(int argc, const char * argv[]) {
    static mach_timebase_info_data_t sTimebaseInfo;
    int seq = 0;
    int cpu = 0;
    // insert code here...
    int* data = (int*) malloc(sizeof(cl_int)*RANGE);
    for (int i = 0; i < RANGE; i ++) {
        data[i] = START + i;
        //printf("%d",data[i]);
    }
    
    int* out = (int*) malloc(sizeof(cl_int)*RANGE);
    printf("Hello, World!\n");
    if (argc > 1){
        if (strncmp(argv[1], "seq", 3) == 0) {
            seq = TRUE;
        } else if (strncmp(argv[1], "cpu", 3) == 0) {
            cpu = 1;
        }
    }
    uint64_t start = mach_absolute_time();
    if (seq)
        euler_totient(data, out);
    else {
        dispatch_queue_t queue;
        if (cpu)
            queue = gcl_create_dispatch_queue(CL_DEVICE_TYPE_CPU, NULL);
        else
            queue = gcl_create_dispatch_queue(CL_DEVICE_TYPE_GPU, NULL);
       
        void *mem_in = gcl_malloc(sizeof(cl_int)*RANGE, data, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR);
        void *mem_out = gcl_malloc(sizeof(cl_int)*RANGE, NULL, CL_MEM_WRITE_ONLY);
        dispatch_sync(queue, ^{
            size_t wgs;
            gcl_get_kernel_block_workgroup_info(euler_totient_kernel,
                                               CL_KERNEL_WORK_GROUP_SIZE,
                                               sizeof(wgs), &wgs, NULL);
            
            cl_ndrange range = {
                1,
                {0, 0, 0},
                {RANGE, 0, 0},
                {wgs, 0, 0}
            };
            
            euler_totient_kernel(&range,(cl_int*)mem_in, (cl_int*)mem_out);
            
            gcl_memcpy(out, mem_out, sizeof(cl_float) * RANGE);
            
        });
    }