#include #include #include "rts/complex.h" #include "compare.h" template __global__ void add(rts::complex a, rts::complex b, rts::complex* c) { *c = a + b; } template __global__ void multiply(rts::complex a, rts::complex b, rts::complex* c) { *c = a * b; } template __global__ void multiply(rts::complex a, T b, rts::complex* c) { *c = a * b; } template __global__ void divide(rts::complex a, rts::complex b, rts::complex* c) { *c = a / b; } template __global__ void log(rts::complex a, rts::complex* c) { *c = rts::log(a); } template __global__ void sqrt(rts::complex a, rts::complex* c) { *c = rts::sqrt(a); } template __global__ void exp(rts::complex a, rts::complex* c) { *c = rts::exp(a); } template __global__ void pow(rts::complex a, rts::complex* c) { *c = rts::pow(a, (T)2.0); } template __global__ void sin(rts::complex a, rts::complex* c) { *c = rts::sin(a); } template __global__ void cos(rts::complex a, rts::complex* c) { *c = rts::cos(a); } template void gpuValidateOperators() { int precision = sizeof(T) * 8; std::stringstream ss; ss<<" ("<* gpuResult; cudaMalloc((void**)&gpuResult, sizeof(rts::complex)); //validate complex binary functions T x0, x1, y0, y1; for(int i = 0; i stdComplex0(x0, y0); rts::complex rtsComplex0(x0, y0); std::complex stdComplex1(x1, y1); rts::complex rtsComplex1(x1, y1); std::complex stdResult; rts::complex rtsResult; //test addition stdResult = stdComplex0 + stdComplex1; add<<<1, 1>>>(rtsComplex0, rtsComplex1, gpuResult); cudaMemcpy(&rtsResult, gpuResult, sizeof(rts::complex), cudaMemcpyDeviceToHost); compare(stdResult, rtsResult, std::string("Binary Addition") + bitString); //std::cout<>>(rtsComplex0, rtsComplex1, gpuResult); cudaMemcpy(&rtsResult, gpuResult, sizeof(rts::complex), cudaMemcpyDeviceToHost); compare(stdResult, rtsResult, std::string("Binary Multiplication") + bitString); //test multiplication with constant stdResult = stdComplex0 * stdComplex1.real(); multiply<<<1, 1>>>(rtsComplex0, rtsComplex1.r, gpuResult); cudaMemcpy(&rtsResult, gpuResult, sizeof(rts::complex), cudaMemcpyDeviceToHost); compare(stdResult, rtsResult, std::string("Multiplication with Real Value") + bitString); //test division stdResult = stdComplex0 / stdComplex1; divide<<<1, 1>>>(rtsComplex0, rtsComplex1, gpuResult); cudaMemcpy(&rtsResult, gpuResult, sizeof(rts::complex), cudaMemcpyDeviceToHost); compare(stdResult, rtsResult, std::string("Binary Division") + bitString); //test log() stdResult = log(stdComplex0); log<<<1, 1>>>(rtsComplex0, gpuResult); cudaMemcpy(&rtsResult, gpuResult, sizeof(rts::complex), cudaMemcpyDeviceToHost); compare(stdResult, rtsResult, std::string("log()") + bitString); //test exp() stdResult = exp(stdComplex0); exp<<<1, 1>>>(rtsComplex0, gpuResult); cudaMemcpy(&rtsResult, gpuResult, sizeof(rts::complex), cudaMemcpyDeviceToHost); compare(stdResult, rtsResult, std::string("exp()") + bitString); //test pow() stdResult = pow(stdComplex0, 2); pow<<<1, 1>>>(rtsComplex0, gpuResult); cudaMemcpy(&rtsResult, gpuResult, sizeof(rts::complex), cudaMemcpyDeviceToHost); compare(stdResult, rtsResult, std::string("pow()") + bitString); //test sqrt() stdResult = sqrt(stdComplex0); sqrt<<<1, 1>>>(rtsComplex0, gpuResult); cudaMemcpy(&rtsResult, gpuResult, sizeof(rts::complex), cudaMemcpyDeviceToHost); compare(stdResult, rtsResult, std::string("sqrt()") + bitString); //trigonometric functions stdResult = sin(stdComplex0); sin<<<1, 1>>>(rtsComplex0, gpuResult); cudaMemcpy(&rtsResult, gpuResult, sizeof(rts::complex), cudaMemcpyDeviceToHost); compare(stdResult, rtsResult, std::string("sin()") + bitString); //trigonometric functions stdResult = cos(stdComplex0); cos<<<1, 1>>>(rtsComplex0, gpuResult); cudaMemcpy(&rtsResult, gpuResult, sizeof(rts::complex), cudaMemcpyDeviceToHost); compare(stdResult, rtsResult, std::string("cos()") + bitString); } cudaFree(gpuResult); } void gpuValidateComplex() { gpuValidateOperators(); //gpuValidateOperators(); }