utilities.cl 3.53 KB
Newer Older
1
2
3
4
/**
 * Fill a buffer with 0.
 */

5
__kernel void clearBuffer(__global int* buffer, int size) {
6
    int index = get_global_id(0);
7
    __global int4* buffer4 = (__global int4*) buffer;
8
9
    int sizeDiv4 = size/4;
    while (index < sizeDiv4) {
10
        buffer4[index] = (int4) 0;
11
        index += get_global_size(0);
12
13
14
    }
    if (get_global_id(0) == 0)
        for (int i = sizeDiv4*4; i < size; i++)
15
            buffer[i] = 0;
16
}
17

18
19
20
/**
 * Fill two buffers with 0.
 */
21
__kernel void clearTwoBuffers(__global int* buffer1, int size1, __global int* buffer2, int size2) {
22
23
24
25
26
27
28
    clearBuffer(buffer1, size1);
    clearBuffer(buffer2, size2);
}

/**
 * Fill three buffers with 0.
 */
29
__kernel void clearThreeBuffers(__global int* buffer1, int size1, __global int* buffer2, int size2, __global int* buffer3, int size3) {
30
31
32
33
34
35
36
37
    clearBuffer(buffer1, size1);
    clearBuffer(buffer2, size2);
    clearBuffer(buffer3, size3);
}

/**
 * Fill four buffers with 0.
 */
38
__kernel void clearFourBuffers(__global int* buffer1, int size1, __global int* buffer2, int size2, __global int* buffer3, int size3, __global int* buffer4, int size4) {
39
40
41
42
43
44
    clearBuffer(buffer1, size1);
    clearBuffer(buffer2, size2);
    clearBuffer(buffer3, size3);
    clearBuffer(buffer4, size4);
}

45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/**
 * Fill five buffers with 0.
 */
__kernel void clearFiveBuffers(__global int* buffer1, int size1, __global int* buffer2, int size2, __global int* buffer3, int size3, __global int* buffer4, int size4, __global int* buffer5, int size5) {
    clearBuffer(buffer1, size1);
    clearBuffer(buffer2, size2);
    clearBuffer(buffer3, size3);
    clearBuffer(buffer4, size4);
    clearBuffer(buffer5, size5);
}

/**
 * Fill six buffers with 0.
 */
__kernel void clearSixBuffers(__global int* buffer1, int size1, __global int* buffer2, int size2, __global int* buffer3, int size3, __global int* buffer4, int size4, __global int* buffer5, int size5, __global int* buffer6, int size6) {
    clearBuffer(buffer1, size1);
    clearBuffer(buffer2, size2);
    clearBuffer(buffer3, size3);
    clearBuffer(buffer4, size4);
    clearBuffer(buffer5, size5);
    clearBuffer(buffer6, size6);
}

68
69
70
71
72
73
74
75
76
77
78
79
/**
 * Sum a collection of buffers into the first one.
 */

__kernel void reduceFloat4Buffer(__global float4* buffer, int bufferSize, int numBuffers) {
    int index = get_global_id(0);
    int totalSize = bufferSize*numBuffers;
    while (index < bufferSize) {
        float4 sum = buffer[index];
        for (int i = index+bufferSize; i < totalSize; i += bufferSize)
            sum += buffer[i];
        buffer[index] = sum;
80
        index += get_global_size(0);
81
82
    }
}
83

84
85
86
87
88
89
90
91
92
93
94
95
96
97
/**
 * Sum the various buffers containing forces.
 */
__kernel void reduceForces(__global long* longBuffer, __global float4* buffer, int bufferSize, int numBuffers) {
    int totalSize = bufferSize*numBuffers;
    float scale = 1.0f/(float) 0xFFFFFFFF;
    for (int index = get_global_id(0); index < bufferSize; index += get_global_size(0)) {
        float4 sum = (float4) (scale*longBuffer[index], scale*longBuffer[index+bufferSize], scale*longBuffer[index+2*bufferSize], 0.0f);
        for (int i = index; i < totalSize; i += bufferSize)
            sum += buffer[i];
        buffer[index] = sum;
    }
}

98
/**
99
 * This is called to determine the accuracy of various native functions.
100
101
 */

102
__kernel void determineNativeAccuracy(__global float8* values, int numValues) {
Peter Eastman's avatar
Peter Eastman committed
103
    for (int i = get_global_id(0); i < numValues; i += get_global_size(0)) {
104
105
        float v = values[i].s0;
        values[i] = (float8) (v, native_sqrt(v), native_rsqrt(v), native_recip(v), native_exp(v), native_log(v), 0.0f, 0.0f);
106
    }
107
}