如何在Visual Studio 2013中启用CUDA 7.0+每线程默认流?

时间:2015-12-14 04:47:51

标签: c++ multithreading visual-studio-2013 cuda

我按照GPU Pro Tip: CUDA 7 Streams Simplify Concurrency中提供的方法进行了测试,并使用CUDA 7.5在VS2013中对其进行了测试。虽然多流示例有效,但多线程示例并未给出预期结果。代码如下:

#include <pthread.h>
#include <cstdio>
#include <cmath>

#define CUDA_API_PER_THREAD_DEFAULT_STREAM

#include "cuda.h"

const int N = 1 << 20;

__global__ void kernel(float *x, int n)
{
    int tid = threadIdx.x + blockIdx.x * blockDim.x;
    for (int i = tid; i < n; i += blockDim.x * gridDim.x) {
        x[i] = sqrt(pow(3.14159, i));
    }
}

void *launch_kernel(void *dummy)
{
    float *data;
    cudaMalloc(&data, N * sizeof(float));

    kernel << <1, 64 >> >(data, N);

    cudaStreamSynchronize(0);

    return NULL;
}

int main()
{
    const int num_threads = 8;

    pthread_t threads[num_threads];

    for (int i = 0; i < num_threads; i++) {
        if (pthread_create(&threads[i], NULL, launch_kernel, 0)) {
            fprintf(stderr, "Error creating threadn");
            return 1;
        }
    }

    for (int i = 0; i < num_threads; i++) {
        if (pthread_join(threads[i], NULL)) {
            fprintf(stderr, "Error joining threadn");
            return 2;
        }
    }

    cudaDeviceReset();

    return 0;
}

我还尝试将宏CUDA_API_PER_THREAD_DEFAULT_STREAM添加到CUDA C / C ++ - &gt; Host-&gt;预处理器定义,但结果是相同的。 Profiler生成的时间表如下: enter image description here

你对这里发生的事情有什么看法吗?提前谢谢了。

2 个答案:

答案 0 :(得分:1)

您发布的代码对我有用,正如您所期望的那样:

enter image description here

编译并在具有CUDA 7.0的Linux系统上运行时如下:

$ nvcc -arch=sm_30  --default-stream per-thread -o thread.out thread.cu

由此我只能假设您有特定于平台的问题,或者您的构建方法不正确(请注意,必须为构建中的每个翻译单元指定--default-stream per-thread。)

答案 1 :(得分:1)

更新:当我添加&#34; cudaFree&#34;时,可能会发生并发现象。如下所示。是因为缺乏同步吗?

void *launch_kernel(void *dummy)
{
    float *data;
    cudaMalloc(&data, N * sizeof(float));

    kernel << <1, 64 >> >(data, N);
    cudaFree(data); // Concurrency may happen when I add this line
    cudaStreamSynchronize(0);

    return NULL;
}

编译如下:

nvcc -arch=sm_30  --default-stream per-thread -lpthreadVC2 kernel.cu -o kernel.exe

https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=59.4141,24.8334&radius=50&key=[YOUR_API_KEY]