// // File: hello.c // // Abstract: A simple "Hello World" compute example showing basic usage of OpenCL which // calculates the mathematical square (X[i] = pow(X[i],2)) for a buffer of // floating point values. // // // Version: <1.0> // // Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Inc. ("Apple") // in consideration of your agreement to the following terms, and your use, // installation, modification or redistribution of this Apple software // constitutes acceptance of these terms. If you do not agree with these // terms, please do not use, install, modify or redistribute this Apple // software. // // In consideration of your agreement to abide by the following terms, and // subject to these terms, Apple grants you a personal, non - exclusive // license, under Apple's copyrights in this original Apple software ( the // "Apple Software" ), to use, reproduce, modify and redistribute the Apple // Software, with or without modifications, in source and / or binary forms; // provided that if you redistribute the Apple Software in its entirety and // without modifications, you must retain this notice and the following text // and disclaimers in all such redistributions of the Apple Software. Neither // the name, trademarks, service marks or logos of Apple Inc. may be used to // endorse or promote products derived from the Apple Software without specific // prior written permission from Apple. Except as expressly stated in this // notice, no other rights or licenses, express or implied, are granted by // Apple herein, including but not limited to any patent rights that may be // infringed by your derivative works or by other works in which the Apple // Software may be incorporated. // // The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO // WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED // WARRANTIES OF NON - INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A // PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION // ALONE OR IN COMBINATION WITH YOUR PRODUCTS. // // IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR // CONSEQUENTIAL DAMAGES ( INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION ) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION // AND / OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER // UNDER THEORY OF CONTRACT, TORT ( INCLUDING NEGLIGENCE ), STRICT LIABILITY OR // OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Copyright ( C ) 2008 Apple Inc. All Rights Reserved. // //////////////////////////////////////////////////////////////////////////////// #include #include #include #include #include #include #include #include #include #include /* time_t, struct tm, difftime, time, mktime */ //////////////////////////////////////////////////////////////////////////////// // Use a static data size for simplicity // #define DATA_SIZE (64) #define SMPL_SZ (128) #ifndef INFINITY #define INFINITY 1.0/0 #endif #ifndef M_PI #define M_PI 3.141592653589793 #endif //////////////////////////////////////////////////////////////////////////////// // Simple compute kernel which computes the square of an input array // const char *KernelSource = "\n" \ "#ifndef INFINITY \n" \ "#define INFINITY 1.0/0 \n" \ "#endif \n" \ "#define SMPL_SZ (128) \n" \ "#ifndef M_PI \n" \ "#define M_PI 3.14159265358979323846 \n" \ "#endif \n" \ "void dct_ii(int N, float *x, float *X) { \n" \ " float sum = 0.; \n" \ " for (int n = 0; n < N; ++n) { \n" \ " sum += x[n]; \n" \ " } \n" \ " X[0] = sum; \n" \ " for (uint k = 1; k < N; ++k) { \n" \ " sum = 0.; \n" \ " for (int n = 0; n < N; ++n) { \n" \ " sum += x[n] * cos((float)(M_PI * (n + .5) * k / N)); \n" \ " //sum += x[n] * cos((float)(M_PI) * (float)((n + .5) * k) / (float)N); \n" \ " } \n" \ " X[k] = sum; \n" \ " } \n" \ "} \n" \ " \n" \ "__kernel void test_dct( __global float *gdata, __global float *gres, __global int *gN){ \n" \ " uint gid = get_global_id(0); \n" \ " uint idx = gid*SMPL_SZ; \n" \ " int N; \n" \ " float data[SMPL_SZ]; \n" \ " float res[SMPL_SZ]; \n" \ " N = gN[0]; \n" \ " for(uint i=0; i