Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么这个类成员变量在调用CUDA内核函数时不改变?_C++_C++11_Cuda - Fatal编程技术网

C++ 为什么这个类成员变量在调用CUDA内核函数时不改变?

C++ 为什么这个类成员变量在调用CUDA内核函数时不改变?,c++,c++11,cuda,C++,C++11,Cuda,在一个简单的测试CUDA应用程序中,我有一个指向类实例列表的指针,并将该数据复制到GPU。然后我多次运行内核函数。然后,内核函数为每个类实例调用一个\uuuu设备成员函数,该函数增加一个变量profitLoss 由于某些原因,profitLoss没有递增。以下是我的代码: #include <stdio.h> #include <stdlib.h> #define N 200000 class Strategy { private: doubl

在一个简单的测试CUDA应用程序中,我有一个指向类实例列表的指针,并将该数据复制到GPU。然后我多次运行内核函数。然后,内核函数为每个类实例调用一个
\uuuu设备
成员函数,该函数增加一个变量
profitLoss

由于某些原因,
profitLoss
没有递增。以下是我的代码:

#include <stdio.h>
#include <stdlib.h>

#define N 200000

class Strategy {
    private:
        double profitLoss;

    public:
        __device__ __host__ Strategy() {
            this->profitLoss = 0;
        }
        __device__ __host__ void backtest() {
            this->profitLoss++;
        }
        __device__ __host__ double getProfitLoss() {
            return this->profitLoss;
        }
};

__global__ void backtestStrategies(Strategy *strategies) {
    int i = blockIdx.x * blockDim.x + threadIdx.x;

    if (i < N) {
        strategies[i].backtest();
    }
}

int main() {
    int threadsPerBlock = 1024;
    int blockCount = 32;

    Strategy *devStrategies;
    Strategy *strategies = (Strategy*)malloc(N * sizeof(Strategy));
    int i = 0;

    // Allocate memory for strategies on the GPU.
    cudaMalloc((void**)&devStrategies, N * sizeof(Strategy));

    // Initialize strategies on host.
    for (i=0; i<N; i++) {
        strategies[i] = Strategy();
    }

    // Copy strategies from host to GPU.
    cudaMemcpy(devStrategies, strategies, N * sizeof(Strategy), cudaMemcpyHostToDevice);

    for (i=0; i<363598; i++) {
        backtestStrategies<<<blockCount, threadsPerBlock>>>(devStrategies);
    }

    // Copy strategies from the GPU.
    cudaMemcpy(strategies, devStrategies, N * sizeof(Strategy), cudaMemcpyDeviceToHost);

    // Display results.
    for (i=0; i<N; i++) {
        printf("%f\n", strategies[i].getProfitLoss());
    }

    // Free memory for the strategies on the GPU.
    cudaFree(devStrategies);

    return 0;
}
我希望是:

363598.000000
363598.000000
363598.000000
363598.000000
363598.000000
363598.000000
363598.000000
363598.000000
...
我相信
profitLoss
不会因为我初始化对象的方式(自动存储持续时间)而增加,我也不确定是否有更好的方式来实例化这些对象并
cudaMemcpy
将它们转移到GPU:

strategies[i] = Strategy();
有人能就如何解决这个问题或原因提供一些建议吗?提前谢谢你



更新对于前32768个输出行,似乎有数据,然后,每一行都是零。因此,我可能遇到了某种限制。

根据您的网格dim
blockCount
和block dim
threadsPerBlock
设置,您只启动32x1024个线程,每个线程只更新一个实例。这就是为什么在向量的开头只有32768个非零结果

为了获得预期的结果,您可以通过增加网格dim
blockCount
来增加GPU线程的数量,使其足以覆盖所有
N
元素,或者

您可以在内核函数中使用for循环,让每个GPU线程更新几个元素,直到所有元素都更新为止

第二种方式是首选的,因为它具有更少的块启动开销。但您可能仍然需要大于32的网格dim来充分利用您的GPU。你可以在这里找到更多细节


根据网格dim
blockCount
和块dim
threadsPerBlock
设置,您只启动32x1024个线程,每个线程只更新一个实例。这就是为什么在向量的开头只有32768个非零结果

为了获得预期的结果,您可以通过增加网格dim
blockCount
来增加GPU线程的数量,使其足以覆盖所有
N
元素,或者

您可以在内核函数中使用for循环,让每个GPU线程更新几个元素,直到所有元素都更新为止

第二种方式是首选的,因为它具有更少的块启动开销。但您可能仍然需要大于32的网格dim来充分利用您的GPU。你可以在这里找到更多细节


以前从未见过cuda代码,请原谅我的无知。从0到363598的for循环应该做什么?但是它看起来像是正在执行
backtestStrategies
blockCount*
threadsPerBlock
次:32*1024,类似于您看到的32768行输出。从0到363598的for循环表示通过363598历史数据记录的循环。谢谢你的洞察力!以前从未见过cuda代码,请原谅我的无知。从0到363598的for循环应该做什么?但是它看起来像是正在执行
backtestStrategies
blockCount*
threadsPerBlock
次:32*1024,类似于您看到的32768行输出。从0到363598的for循环表示通过363598历史数据记录的循环。谢谢你的洞察力!
strategies[i] = Strategy();