只有一个线程执行cuda内核

时间:2016-06-11 21:19:24

标签: c++ cuda

我是GPU编程的新手,特别是CUDA / C ++。我编写了一个简单的代码,只是为了使用atomicAdd将数组的所有成员增加1。

但结果显示数组的第一个元素增加了,其他元素保持不变。我的代码如下。

感谢您提前提供任何帮助。

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#include <iostream>
#include <fstream>
using namespace std;
__global__ void Histcount( int *a)
{
    int i = blockIdx.x*blockDim.x + threadIdx.x;
    {
        atomicAdd(&a[i], 1);
    }
}

int main()
{
    int * hostarray = new int[20];
    int * devarray;
    cudaError_t error;
    error=cudaMalloc(&devarray, sizeof(int) * 20);
    for (int i = 0; i < 20; i++)
    {
        hostarray[i] = i ;
    }
    cudaMemcpy((int *)devarray, (int *)hostarray, sizeof(int) * 20, cudaMemcpyHostToDevice);
    dim3 gs = (1, 1);
    dim3 bs = (20, 1, 1);
    Histcount <<<gs, bs >>>  (devarray);
    cudaMemcpy((int *)hostarray, (int *)devarray, sizeof(int) * 20, cudaMemcpyDeviceToHost);
    for (int i = 0; i < 20; i++)
    {
        cout << hostarray[i]<<endl;

    }
}

1 个答案:

答案 0 :(得分:3)

这不是指定import java.math.BigDecimal; import java.sql.*; import java.util.Arrays; import oracle.jdbc.OracleCallableStatement; import oracle.jdbc.OracleTypes; public class AssocArrayTest { public static void main(String[] args) throws Exception { Connection c = DriverManager.getConnection("url", "user", "password"); OracleCallableStatement s = (OracleCallableStatement)c.prepareCall("{? = call testLookAside.lookupMasterData }"); s.registerIndexTableOutParameter(1, 30, OracleTypes.NUMERIC, 0); s.execute(); BigDecimal[] data = (BigDecimal[])s.getPlsqlIndexTable(1); System.out.println(Arrays.toString(data)); } } 变量的有效方法:

[4, 1, null, 2, null, null, 3]

事实上,编译器可能会在这些行上抛出警告,如果是这样,你就不应该忽略这些警告。

你应该这样做:

dim3

或:

dim3 gs = (1, 1);
dim3 bs = (20, 1, 1);

您的实现问题是编译器不知道您的实际意图,例如:

dim3 gs = dim3(1, 1);
dim3 bs = dim3(20, 1, 1);

就像你拥有它一样,编译器(可能会发出警告,实际上是evaluates that expressiondim3 gs(1, 1); dim3 bs(20, 1, 1); ,然后将其作为标量分配给(20, 1, 1) 变量。所以最终你的块大小为1,网格大小为1(这不是你的意图),你的代码只运行了1个线程。