From d3d0b38b90f14660ecb6243373daa921f8ae02b1 Mon Sep 17 00:00:00 2001 From: Tor Aamodt Date: Sat, 17 Jul 2010 10:29:05 -0800 Subject: integrating Wilson's bugfixes from release branch [git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 6869] --- benchmarks/CUDA/DirectedTests/Makefile | 3 + benchmarks/CUDA/DirectedTests/TextureTest.cu | 96 ++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 benchmarks/CUDA/DirectedTests/Makefile create mode 100644 benchmarks/CUDA/DirectedTests/TextureTest.cu (limited to 'benchmarks/CUDA/DirectedTests') diff --git a/benchmarks/CUDA/DirectedTests/Makefile b/benchmarks/CUDA/DirectedTests/Makefile new file mode 100644 index 0000000..2c09c1c --- /dev/null +++ b/benchmarks/CUDA/DirectedTests/Makefile @@ -0,0 +1,3 @@ + +TextureTest: TextureTest.cu + nvcc -g -o TextureTest TextureTest.cu diff --git a/benchmarks/CUDA/DirectedTests/TextureTest.cu b/benchmarks/CUDA/DirectedTests/TextureTest.cu new file mode 100644 index 0000000..42131a5 --- /dev/null +++ b/benchmarks/CUDA/DirectedTests/TextureTest.cu @@ -0,0 +1,96 @@ +#include +#include + +#include +#include + +#define TEXSIZE 4096 +texture texData; + +void cuda_errcheck(const char *msg) { + cudaError_t err; + if ((err = cudaGetLastError()) != cudaSuccess) { + char errmsg[1024]; + sprintf(errmsg,"CUDA error %s: %s", msg, cudaGetErrorString(err)); + } +} + +void cuda_bind_texture_data(const float4 *t) { + static cudaArray *ct; + if ( ! ct ) { + cudaMallocArray(&ct, &texData.channelDesc, TEXSIZE, 1); + cuda_errcheck("allocating texDataArray"); + } cudaMemcpyToArray(ct, 0, 0, t, TEXSIZE*sizeof(float4), cudaMemcpyHostToDevice); + cuda_errcheck("memcpy to texDataArray"); + + texData.normalized = true; + texData.addressMode[0] = cudaAddressModeClamp; + texData.addressMode[1] = cudaAddressModeClamp; + texData.filterMode = cudaFilterModeLinear; + + cudaBindTextureToArray(texData, ct); + cuda_errcheck("binding texDataArray to texture"); +} + + +__global__ void testKernel(float4 *data, float *coord) +{ + int gsize = blockDim.x * gridDim.x; + int gid = threadIdx.x + blockDim.x * blockIdx.x; + + float norm_coord = (float)(gid + 32) / gsize; + + data[gid] = tex1D(texData, norm_coord); + coord[gid] = norm_coord; +} + +#define NUMTHREADS (TEXSIZE * 4) + +int main(int argc, char *argv[]) +{ + float4 h_texData[TEXSIZE]; + + for (int t = 0; t < TEXSIZE; t++) { + h_texData[t].x = t + 10000; + h_texData[t].y = t + 20000; + h_texData[t].z = t + 30000; + h_texData[t].w = t + 40000; + } + + float4 *h_output = new float4[NUMTHREADS]; + float4 *d_output; + cudaMalloc(&d_output, NUMTHREADS * sizeof(float4)); + cuda_errcheck("output malloc"); + + float *h_coord = new float[NUMTHREADS]; + float *d_coord; + cudaMalloc(&d_coord, NUMTHREADS * sizeof(float)); + cuda_errcheck("coord malloc"); + + cudaSetDevice(0); + cuda_errcheck("device init"); + + cuda_bind_texture_data(h_texData); + + dim3 dimBlock(256, 1, 1); + dim3 dimGrid(NUMTHREADS / 256, 1, 1); + + testKernel<<>> (d_output, d_coord); + cuda_errcheck("kernel launch"); + + cudaThreadSynchronize(); + + cudaMemcpy(h_output, d_output, NUMTHREADS * sizeof(float4), cudaMemcpyDeviceToHost); + cuda_errcheck("output copy"); + + cudaMemcpy(h_coord, d_coord, NUMTHREADS * sizeof(float), cudaMemcpyDeviceToHost); + cuda_errcheck("coord copy"); + + for (int t = 0; t < NUMTHREADS; t++) { + printf("output[%d] (%.06f) = (%5.3f, %5.3f, %5.3f, %5.3f)\n", t, h_coord[t], + h_output[t].x, h_output[t].y, h_output[t].z, h_output[t].w); + } + + return 0; +} + -- cgit v1.3