私の会社には2つのGTX295がセットアップされているため、サーバーには合計4つのGPUがあり、複数のサーバーがあります。GPU 1は、GPU 0、2、3と比較して特に遅いので、問題の原因を見つけるのに役立つ小さな速度テストを作成しました。
//#include <stdio.h>
//#include <stdlib.h>
//#include <cuda_runtime.h>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <cutil.h>
__global__ void test_kernel(float *d_data) {
int tid = blockDim.x*blockIdx.x + threadIdx.x;
for (int i=0;i<10000;++i) {
d_data[tid] = float(i*2.2);
d_data[tid] += 3.3;
}
}
int main(int argc, char* argv[])
{
int deviceCount;
cudaGetDeviceCount(&deviceCount);
int device = 0; //SELECT GPU HERE
cudaSetDevice(device);
cudaEvent_t start, stop;
unsigned int num_vals = 200000000;
float *h_data = new float[num_vals];
for (int i=0;i<num_vals;++i) {
h_data[i] = float(i);
}
float *d_data = NULL;
float malloc_timer;
cudaEventCreate(&start);
cudaEventCreate(&stop); cudaEventRecord( start, 0 );
cudaMemcpy(d_data, h_data, sizeof(float)*num_vals,cudaMemcpyHostToDevice);
cudaMalloc((void**)&d_data, sizeof(float)*num_vals);
cudaEventRecord( stop, 0 ); cudaEventSynchronize( stop ); cudaEventElapsedTime( &malloc_timer, start, stop );
cudaEventDestroy( start );
cudaEventDestroy( stop );
float mem_timer;
cudaEventCreate(&start);
cudaEventCreate(&stop); cudaEventRecord( start, 0 );
cudaMemcpy(d_data, h_data, sizeof(float)*num_vals,cudaMemcpyHostToDevice);
cudaEventRecord( stop, 0 ); cudaEventSynchronize( stop ); cudaEventElapsedTime( &mem_timer, start, stop );
cudaEventDestroy( start );
cudaEventDestroy( stop );
float kernel_timer;
cudaEventCreate(&start);
cudaEventCreate(&stop); cudaEventRecord( start, 0 );
test_kernel<<<1000,256>>>(d_data);
cudaEventRecord( stop, 0 ); cudaEventSynchronize( stop ); cudaEventElapsedTime( &kernel_timer, start, stop );
cudaEventDestroy( start );
cudaEventDestroy( stop );
printf("cudaMalloc took %f ms\n",malloc_timer);
printf("Copy to the GPU took %f ms\n",mem_timer);
printf("Test Kernel took %f ms\n",kernel_timer);
cudaMemcpy(h_data,d_data, sizeof(float)*num_vals,cudaMemcpyDeviceToHost);
delete[] h_data;
return 0;
}
結果は
GPU0cudaMallocは0.908640ミリ秒かかりましたGPUへのコピーは296.058777ミリ秒かかりましたテストカーネルは326.721283ミリ秒かかりました
GPU1cudaMallocは0.913568ミリ秒かかりましたGPUへのコピーは663.182251ミリ秒かかりました テストカーネルは326.710785ミリ秒かかりました
GPU2cudaMallocは0.925600ミリ秒かかりましたGPUへのコピーは296.915039ミリ秒かかりましたテストカーネルは327.127930ミリ秒かかりました
GPU3cudaMallocは0.920416ミリ秒かかりましたGPUへのコピーは296.968384ミリ秒かかりましたテストカーネルは327.038696ミリ秒かかりました
ご覧のとおり、GPUへのcudaMemcpyは、GPU1の2倍の時間です。これはすべてのサーバー間で一貫しており、低速なのは常にGPU1です。なぜこれが起こるのか、何か考えはありますか?すべてのサーバーはWindowsXPを実行しています。