我是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;
}
}
答案 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 expression为dim3 gs(1, 1);
dim3 bs(20, 1, 1);
,然后将其作为标量分配给(20, 1, 1)
变量。所以最终你的块大小为1,网格大小为1(这不是你的意图),你的代码只运行了1个线程。